2011-12-28 3 views
5

Załóżmy mam wstawianie rekordów w poniższych tabelach jednocześnie
Tabela 1
Tabela 2
Tabela 3
Tabela 4
Tabela 5Jak maintan transakcję w LINQ do udziałów w jednostkach

Now What I chcesz to zrobić, W przypadku jakiegokolwiek wyjątku lub błędu podczas wstawiania w Tabeli 3, nagrywaj, które są wstawiane wcześniej (np. w Tabeli 1 i Tabeli 2) muszą zostać wycofane ...

Jak można ja zarządzać taką transakcją?

Odpowiedz

3

Domyślnie SaveChanges wykona w transakcji (patrz Remarks part w docs)

Jeśli chcesz mieć większą kontrolę nad transakcją, można owinąć SaveChanges zablokować w TransactionScope. SaveChanges następnie zbierze transakcję otoczenia i użyje tej.

Może to być przydatne, gdy chcesz rozproszoną transakcję (na przykład z wieloma kontekstami lub jeśli używasz WCF).

Jak wspomniano, które wykorzystują różne modele, należałoby użyć zarówno ObjectContexts ciągu TransactionScope (i używać some logic z AcceptAllChanges)

Twój kod będzie wtedy wyglądać tak:

using (TransactionScope scope = new TransactionScope()) 
{ 
    //Do something with context1 
    //Do something with context2 


    //Save Changes but don't discard yet 
    context1.SaveChanges(false); 

    //Save Changes but don't discard yet 
    context2.SaveChanges(false); 


    //if we get here things are looking good. 
    scope.Complete(); 

    //If we get here it is save to accept all changes. 
    context1.AcceptAllChanges(); 
    context2.AcceptAllChanges(); 
} 
+0

Yup Mam odpowiedź, dzięki :) –

4

Jest to domyślne zachowanie Entity Framework 4

Transakcja jest niejawna .. jak najszybciej zadzwonić SaveChanges jakieś błędy spowoduje cofnięcia.

+0

mogę obsłużyć go ręcznie ? Właściwie PrimaryKey z Table1 byłoby ForeignKey dla Table2 i PK Of Table2 byłoby FK dla Table3 i tak dalej ... Więc jak to działa? –

+0

@DotNetIsMyPower Musisz je skojarzyć. Określ to powiązanie tak, jakby pola były już dostępne. Table2.Prop = Tabela1.Prop; itp. – scartag

+0

Ale są w innym modelu. chociaż pozwól mi spróbować. @scartag Dziękuję kolego za szybką odpowiedź –