2015-12-21 4 views
16

Qualcuno sa come creare una transazione esplicita in Entity Framework 7 ??? Tutte le informazioni che ho trovato si riferiscono alla versione 6 di EF. Anche la documentazione è molto incompleta, quindi qualcuno potrebbe fornirne un esempio?esplicita operazione in Entity Framework 7

Ho un dbContext e devo eliminare un'entità ed è relativi oggetti, e quindi inserirli di nuovo, ma nella stessa transazione, quindi avrò sempre una "versione" delle righe.

+0

Potrebbe includere piccolo frammento di codice in cui si desidera utilizzare la transazione? Avete alcuni 'dbContext' o' DbCommand'? In genere si dovrebbe usare 'utilizzando (context.Database.BeginTransaction()) {.../* qualcosa da eseguire */...}', ma si può usare 'attendere context.Database.BeginTransactionAsync()', invece. Si può usare 'using (var transaction = context.Database.BeginTransaction()) {...}' e chiamare 'transaction.Commit()' esplicitamente per eseguire il commit della transazione o chiamare 'transaction.Rollback()' per il rollback. Esistono più esotici [EnlistTransaction] (https://msdn.microsoft.com/en-us/library/ms254973 (v = vs.110) .aspx). – Oleg

+0

Non così esotico ... ancora ;-) Quindi, i byte sono gli stessi di EF6? Poi mi sono perso qualcosa. Ho un dbContext e devo eliminare un'entità e sono oggetti correlati e quindi inserirli di nuovo. – Vi100

+0

Ok, il tuo codice funziona, ma è lo stesso di EF6. Ti dispiace se elimino la domanda o preferisco che la modifichi e pubblichi il tuo commento come risposta? – Vi100

risposta

14

La funzionalità operazione sono inclusi nel EF7 partendo RC1 solo (vedi the statement). La chiamata di .SaveChanges() (o .SaveChangesAsync()) deve utilizzare la transazione automatica. Quindi suppongo che lo stato di alcuni elementi delle entità dovrebbe essere contrassegnato come eliminato prima, per esempio.

Si può avviare la transazione in modo esplicito avvolgendo qualche frammento di manipolazione sul database interno di

using (context.Database.BeginTransaction()) { 
    /*do something*/ 
} 

L'operazione sarà commesso da richiamo .Dispose() alla fine del using blocco. Si può usare alternativamente

using (var transaction = await context.Database.BeginTransactionAsync()) { 
    /*do something*/ 
    /*one can call 
     transaction.Rollback() or transaction.Commit() 
     explicitly in the code */ 
} 

In generale dovrebbe apparire nella versione precedente di Entity Framework. Vedere the post per esempio.

+0

Questo non è in RC-1 finale, ha bisogno di una versione più recente di DatabaseFacade. – user764754

+0

@ user764754: hai verificato questo? Guarda [test] (https://github.com/aspnet/EntityFramework/blob/7.0.0-rc1/test/EntityFramework.Relational.FunctionalTests/TransactionTestBase.cs#L62) ad esempio inclusi in RC1. Utilizza 'BeginTransaction()' – Oleg

+0

In RC-1 è un metodo di estensione in EntityFramework.Relational. Più tardi è con DatabaseFacade in EntityFramework.Core. Mi sto riferendo solo al core RC-1, ecco perché non l'ho trovato. – user764754