Mit Entity Framework (Code zuerst in meinem Fall), habe ich eine Operation, die erfordert, dass ich SaveChanges aufrufen, um ein Objekt in der DB zu aktualisieren, und dann SaveChanges erneut, um ein anderes Objekt zu aktualisieren. (Ich brauche die ersten SaveChanges, um ein Problem zu lösen, bei dem EF nicht herausfinden kann, welches Objekt zuerst aktualisiert werden soll).EF: Wie rufe ich SaveChanges zweimal innerhalb einer Transaktion auf?
Ich habe versucht zu tun:
using (var transaction = new TransactionScope())
{
// Do something
db.SaveChanges();
// Do something else
db.SaveChanges();
tramsaction.Complete();
}
Wenn ich laufe, dass ich eine Ausnahme bei dem zweiten SaveChanges
Anruf erhalten, sagen „die zugrunde liegenden Anbieter auf offene fehlgeschlagen“. Die innere Ausnahme besagt, dass MSDTC auf meinem Computer nicht aktiviert ist.
Jetzt habe ich Posts an anderer Stelle gesehen, die beschreiben, wie MSDTC zu aktivieren, aber es scheint, dass ich auch Netzwerkzugriff usw. aktivieren müssen. Das klingt wie komplette Overkill hier, da keine anderen Datenbanken beteiligt sind, lassen allein andere Server. Ich möchte nichts tun, was meine gesamte Anwendung weniger sicher (oder langsamer) macht.
Sicherlich muss es eine leichtere Möglichkeit geben, dies zu tun (idealerweise ohne MSDTC) ?!
Verwenden Sie SQL 2008? Abhängig von Ihrer tatsächlichen Logik können Sie mehrere Verbindungen öffnen, ohne eskalieren zu müssen. Hier ist ein großer Beitrag, der zusammenbricht, wenn das DTC aufgerufen wird: [Transaktionsbereich Eskaliert automatisch zu MSDTC] (http: // stackoverflow.com/questions/1690892/transactionscope-automatisches-escalieren-zu-msdtc-on-some-machines) –
Wenn Sie alles in nur einer Transaktion machen wollen, was ist der Unterschied zwischen einmal alles speichern oder alles speichern? In beiden Fällen wird entweder alles gespeichert oder es wird nichts gespeichert, sodass ich keinen Vorteil mehrer Speichervorgänge sehe. Laut dem Kommentar unten - in Sql Server 2005 öffnen mehrere Verbindungen innerhalb einer Transaktion (auch wenn die Quelle identisch ist) bewirkt, dass die Transaktion als eine verteilte Transaktion heraufgestuft wird. Dies wurde in Sql Server 2008 verbessert, wo Sie mehrere Verbindungen zu derselben Datenquelle innerhalb eines Trx öffnen können, ohne dass es zu einer Promotion kommt. – Pawel
@markoreta: Ich benutze SQL Server 2012. Ich habe (oder möchte) nicht mehrere Verbindungen, und don ' t wollen wirklich MSDTC benutzen! –