Utilizando Entity Framework (primero el código en mi caso), tengo una operación que requiere que llame a SaveChanges para actualizar un objeto en el DB, y luego SaveChanges nuevamente para actualizar otro objeto. (Necesito los primeros SaveChanges para resolver un problema donde EF no puede determinar qué objeto actualizar primero).EF: ¿Cómo puedo llamar a SaveChanges dos veces dentro de una transacción?
He intentado hacer:
using (var transaction = new TransactionScope())
{
// Do something
db.SaveChanges();
// Do something else
db.SaveChanges();
tramsaction.Complete();
}
Cuando corro que, consigo una excepción en el segundo SaveChanges
llamada, diciendo que "el proveedor subyacente falló al abrir". La excepción interna dice que MSDTC no está habilitado en mi máquina.
Ahora, he visto publicaciones en otros lugares que describen cómo habilitar MSDTC, pero parece que también necesitaría habilitar el acceso a la red, etc. Esto parece una exageración completa aquí, ya que no hay otras bases de datos involucradas, deje solo otros servidores. No quiero hacer algo que haga que toda mi aplicación sea menos segura (o más lenta).
Seguramente debe haber una manera más ligera de hacerlo (idealmente sin MSDTC)?
¿Está utilizando SQL 2008? Dependiendo de cuál sea su lógica real, puede abrir múltiples conexiones sin escalar. Aquí hay una gran publicación desglosada cuando se llama al DTC: [Ámbito de la transacción Escalada automática a MSDTC] (http: // stackoverflow.com/questions/1690892/transactionscope-automatically-escalada-a-msdtc-en-algunas-máquinas) –
Si desea hacer todo en una sola transacción, ¿cuál es la diferencia entre guardar todo una vez o guardar todo varias veces? En ambos casos, se guardará todo o no se guardará nada, por lo que no veo ninguna ventaja de guardar varias veces. Según el comentario siguiente: en Sql Server 2005, la apertura de múltiples conexiones dentro de una transacción (incluso si la fuente es la misma) hace que la transacción sea promovida como una transacción distribuida. Esto se mejoró en Sql Server 2008, donde puede abrir múltiples conexiones a la misma fuente de datos dentro de un trx sin causar una promoción – Pawel
@markoreta: estoy usando SQL server 2012. No tengo (o quiero) conexiones múltiples, y no lo hago ¡Realmente quiero usar MSDTC! –