2015-12-21 18 views
16

誰でもEntity Framework 7で明示的なトランザクションを作成する方法を知っていますか? 私が見つけたすべての情報は、EFのバージョン6を参照しています。ドキュメントも非常に不完全です、誰かがそれの例を提供することができますか?Entity Framework 7の明示的なトランザクション

私はdbContextを持っていますが、エンティティを削除して関連オブジェクトを削除してから再度挿入する必要がありますが、同じトランザクションでは常に "バージョン"の行があります。

+0

トランザクションを使用したい場所に小さなコードを含めることはできますか?あなたは 'dbContext'や' DbCommand'をいくつか持っていますか?通常は 'using(context.Database.BeginTransaction()){.../* do something */...}'を使うべきですが、代わりに 'await context.Database.BeginTransactionAsync()'を使うことができます。トランザクションをコミットするために '(var transaction = context.Database.BeginTransaction()){...}'を使用して 'transaction.Commit()'を明示的に呼び出したり、ロールバックのために 'transaction.Rollback()'を呼び出すことができます。よりエキゾチックな[EnlistTransaction](https://msdn.microsoft.com/en-us/library/ms254973(v = vs.110).aspx)が存在します。 – Oleg

+0

エキゾチックではありません...まだ;-)だから、バイトはEF6と同じですか?それから私は何かを逃した。私はdbContextを持っているので、エンティティを削除して関連するオブジェクトにしてから再度挿入する必要があります。 – Vi100

+0

あなたのコードは動作しますが、EF6と同じです。質問を削除したり編集したり、あなたのコメントを回答として投稿したりすることをお勧めしますか? – Vi100

答えて

14

トランザクション機能は、RC1のみから始まるEF7に含まれています(the statement参照)。 .SaveChanges()(または.SaveChangesAsync())のコールは、自動取引を使用する必要があります。次に、エンティティのいくつかのアイテムの状態が、たとえば、以前にDeletedとしてマークされていると仮定します。

一つは

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

の内側にデータベース上の操作のいくつかの断片をラップすることにより、明示的にトランザクションを開始することができますトランザクションがusingブロックの最後に.Dispose()の呼び出しによってコミットされます。代わりに使用することもできます。

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

一般的に、以前のバージョンのEntity Frameworkのようになります。たとえば、the postを参照してください。

+0

これはRC-1の最終版ではないため、DatabaseFacadeの新しいバージョンが必要です。 – user764754

+0

@ user764754:これを確認しましたか? RC1に含まれている[test](https://github.com/aspnet/EntityFramework/blob/7.0.0-rc1/test/EntityFramework.Relational.FunctionalTests/TransactionTestBase.cs#L62)を見てください。それは 'BeginTransaction()'を使用します。 – Oleg

+0

RC-1では、EntityFramework.Relationalの拡張メソッドです。後でEntityFramework.CoreにDatabaseFacadeがあります。私はコアRC-1だけを参照しているので、それを見つけられませんでした。 – user764754

関連する問題