Używam EF5.0 z SQL Server 2008. Mam dwie bazy danych na tej samej instancji serwera. Potrzebuję zaktualizować tabele w obu bazach danych i chcę, aby były to same transakcje. Więc użyłem TransactionScope. Poniżej znajduje się kod -Wiele baz danych (datacontext) na tym samym serwerze bez 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();
}
}
Kiedy używam powyższego kodu Transakcja zostanie awansowana do DTC. Po przeszukaniu w Internecie stwierdziłem, że dzieje się tak z powodu dwóch różnych połączeń/połączeń. Ale nie rozumiem, jeśli piszę procedurę przechowywaną na jednej bazie danych, która aktualizuje tabelę w innej bazie danych (na tym samym serwerze), nie jest wymagany kod DTC. Dlaczego EF lub TransactionScope promuje to w DTC? Czy jest w tym jakaś inna praca?
Proszę doradzić
góry dziękuję
Sai
chcę popełnić transakcje na dwóch całkowicie różnych dbs na tym samym serwerze w ramach jednego zakresu transakcji. Mogłem to zrobić za pomocą procedur przechowywanych, ale nie poprzez EF. Dziękuję za odpowiedź. – Sai
Moja odpowiedź pokazuje, jak użyć 'TransactionScope', aby to zrobić bez odwoływania się do zapisanych procesów. Niejawne 'tx.Dispose()', które występuje po linii 'tx.Complete()', spowoduje zatwierdzenie pojedynczej transakcji, która obejmuje oba INSERTy do dwóch różnych baz danych. Jak wspomniano, w EF istnieją sposoby na zapewnienie połączeń, w których ręcznie nazwano 'ChangeDatabase()', ale w zależności od bazy kodu, które mogą skutkować bardziej ściśle powiązanym kodem (podczas gdy punktem 'TransactionScoep' jest rozłączanie kodu), tylko Ty możesz powiedzieć. –
Nie sądzę, abym mógł używać ChangeDatabase(), ponieważ używam podejścia Databasefirst, a mój dbcontext jest ściśle związany z encjami. Jeśli zmienię łańcuch połączeń w środowisku wykonawczym na zupełnie inną bazę danych, spowoduje to błąd. – Sai