2011-12-28 8 views
5

Supponiamo che io sto inserimento di record in seguito tabelle allo stesso tempo
Tabella 1
Tabella 2
Tabella 3
Tabella 4
Tabella 5Come maintan operazione in LINQ to entités

Ora quello che vuole fare è, In caso di qualsiasi eccezione o errore si verifica durante l'inserimento in Tabella 3, quindi registrare che sono inseriti prima di quello (ad esempio in Tabella 1 e Tabella 2) deve essere ripristinato ...

Come può io gestire una transazione come questa?

risposta

3

Per impostazione predefinita, SaveChanges eseguirà in una transazione (vedere la Remarks part nella documentazione)

Se si desidera un maggiore controllo sulla transazione, è possibile avvolgere le SaveChanges blocco in un TransactionScope. SaveChanges raccoglierà quindi la transazione ambientale e userà quella.

Questo può essere utile quando si desidera una transazione distribuita (ad esempio con più contesti o se si utilizza WCF).

Come lei ha ricordato che si utilizzano diversi modelli, è necessario utilizzare entrambi i ObjectContexts entro un TransactionScope (e utilizzare some logic con AcceptAllChanges)

Il tuo codice sarebbe quindi simile:

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, ho la mia risposta, grazie :) –

4

Questo è il comportamento predefinito di Entity Framework 4

La transazione è implicita .. non appena si chiama SaveChanges eventuali errori attiveranno un rollback.

+0

Posso gestire manualmente ? In realtà PrimaryKey Of Table1 sarebbe ForeignKey per Table2 e PK Of Table2 sarebbe FK per Table3 e così via ... Quindi come funzionerà? –

+0

@DotNetIsMyPower È necessario associarli. Specificare queste associazioni come se i campi fossero già disponibili. Table2.Prop = Table1.Prop; ecc – scartag

+0

Ma sono in modello diverso. comunque fammi provare @scartag Grazie amico per una rapida risposta –