Comandos de ACTUALIZACIÓN atómicos personalizados dentro de SaveChanges ()

c# dapper entity-framework savechanges transactions

Pregunta

Por diversas razones, debo poder hacer varios comandos SQL UPDATE personalizados cuando llamo SaveChanges en un DbContext . Quiero que esto suceda de forma atómica por lo que tanto el SaveChanges normal como el SQL tienen éxito, o ninguno de los dos tiene éxito.

Sin embargo, no sé cómo lograr esto. Lo que he intentado hasta ahora es esto y varias variaciones:

Transacciones EF - Gist

El error aquí es (en la llamada ExecuteSqlCommand ):

ExecuteNonQuery requiere que el comando tenga una transacción cuando la conexión asignada al comando se encuentra en una transacción local pendiente.

De acuerdo, es suficiente. El ExecuteSqlCommand no tiene una sobrecarga que acepte una transacción. Entonces, instalé el paquete Dapper y reemplacé la línea ofensiva con esta llamada Dapper y pasé la transacción:

this.Database.Connection
  .Execute("insert into Tests (Foo, Bar) values ('test', 2)", 
  transaction: tran);

pero ahora el error ocurre en base.SaveChanges() y me da lo siguiente:

SqlConnection no admite transacciones paralelas.

¿Entonces aparentemente SaveChanges crea una nueva transacción a pesar de que ya creé una en la conexión del contexto de datos?

¿Hay alguna forma en que pueda lograr lo que quiero?

Estoy usando Entity Framework 5.0 Code First.

Respuesta aceptada

Ajustar un TransactionScope alrededor de todas las operaciones. Esta clase es la abstracción común para las transacciones .NET. EF y SqlConnection se alistarán automáticamente. Asegúrese de buscar las mejores prácticas, ya que existen algunas dificultades, como desencadenar accidentalmente transacciones distribuidas.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow