2016-09-19 4 views
1

これが.NET APIでEF6トランザクションを処理する最適な方法であるかどうかを確認したいと思いました。したがって、APIが変更された場合、単一のエンティティのみが、ユーザー所有のpotatosのポテトカウントを更新します。それができない場合はEFは変更をコミットしませんので、私はC#.NET API複数のsave.changes()トランザクション

using (var dbContextTransaction = context.Database.BeginTransaction()) {} 

とそれを囲む必要はありません。しかし、単一のAPIエンドポイントがexplのために複数のエンティティを更新する場合、 APIエンドポイントcreateSoup()は、複数の野菜をユーザーから削除し、使用するための新しいエンティティスープを作成します。野菜を取り除いても、スープの実体を作ることができなかった場合には、言及したステートメントでそれを囲む必要があります。逆もまた同様です。他の方法はありませんか?なぜなら、このステートメントの中では、すべてのapiエンドポイント関数(彫刻エンティティを編集する)を置くのはちょっと残酷に思われるからです。

+0

どのように多くの 'context.SaveChanges();'あなたが持っているのですか? 1回の通話であれば、何もする必要はありません。 – Maarten

+0

次の操作が必要なために2つの操作があり、SaveChanges()が呼び出されるまで生成されないエンティティIDがあります。 – MattJ

答えて

1

Database.BeginTransaction()メソッドを適用するアプリケーションの操作を識別する必要があります。

Database.BeginTransaction()方法の機能は、いくつかの動作は、従って、同じトランザクションとall committed又はall rolled backとしてのいずれかの中に組み合わせることができ、既存のDbContext .INすなわち内
することができますstartcompleteトランザクション自体でone.Andまた、トランザクションに対してisolation levelを指定することもできます。

そのような機能が必要ない場合は、context.SaveChanges()のみを簡単に使用できます。前述のように、Transactionsを適用する必要がある操作を明確に識別する必要があります。

注:トランザクションを処理する必要がある場合は、Database.BeginTransaction()メソッドを使用する必要があります。他の方法はありません。

参考:Working with Transactions (EF6 Onwards)

+0

最後のメモについて:もう1つのオプションはTransactionScopeを使用することです。 – Maarten

+0

これは「EF6より前」です。多くの制限があります。もしあなたが '新しいDatabase.BeginTransaction()' APIを使用しているなら、 'TransactionScope'アプローチはもはやほとんどのユーザにとって必要ではありません@Maarten – Sampath

+1

きれいにしてくれてありがとう! :) – MattJ

関連する問題