Ich verwende EF5.0 mit SQL Server 2008. Ich habe zwei Datenbanken auf der gleichen Serverinstanz. Ich muss Tabellen in beiden Datenbanken aktualisieren und möchte, dass sie dieselbe Transaktion sind. Also habe ich das TransactionScope benutzt. Unten ist der Code -Mehrere Datenbanken (Datenkontext) auf demselben Server ohne MS DTC
public void Save()
{
var MSObjectContext = ((IObjectContextAdapter)MSDataContext).ObjectContext;
var AWObjectContext = ((IObjectContextAdapter)AwContext).ObjectContext;
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadUncommitted
}))
{
MSObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
AWObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
scope.Complete();
}
}
Wenn ich den obigen Code verwende, wird die Transaktion zum DTC befördert. Nach der Suche im Internet habe ich festgestellt, dass dies aufgrund zweier verschiedener Verbindungen/Verbindungen geschieht. Aber was ich nicht verstehe, ist, wenn ich eine gespeicherte Prozedur auf eine Datenbank schreibe, die die Tabelle in einer anderen Datenbank (auf demselben Server) aktualisiert, ist kein DTC erforderlich. Warum fördert EF oder TransactionScope dies für DTC? Gibt es dafür noch andere Arbeiten?
Bitte geben
Vielen Dank im Voraus
Sai
Ich mag begehen Transaktionen auf zwei völlig verschiedenen dbs auf demselben Server unter einem Transaktionsumfang. Ich könnte das durch gespeicherte Prozeduren tun, aber nicht durch EF. Danke für deine Antwort. – Sai
Meine Antwort zeigt, wie man ein 'TransactionScope' verwendet, ohne auf gespeicherte Prozeduren zurückzugreifen. Die implizite 'tx.Dispose()', die nach der Zeile 'tx.Complete() 'auftritt, wird die einzelne Transaktion festschreiben, die beide INSERTs zu zwei verschiedenen Datenbanken umfasst. Wie bereits erwähnt, gibt es bei EF Möglichkeiten, Verbindungen bereitzustellen, bei denen Sie 'ChangeDatabase()' manuell aufgerufen haben, aber abhängig von Ihrer Codebasis, die zu eng gekoppeltem Code führen können (während der Punkt 'TransactionScoep' Code entkoppeln soll), nur du kannst es sagen. –
Ich glaube nicht, dass ich ChangeDatabase() verwenden könnte, da ich Databasefirst Ansatz verwende und mein dbcontext fest an die Entitäten gebunden ist. Wenn ich die Verbindungszeichenfolge zur Laufzeit in eine völlig andere Datenbank ändere, wird ein Fehler ausgegeben. – Sai