Entity Frameworkでトランザクションを使用する方法

entity-framework transactions

質問

次のようなコードがあるとします。

Something something = new Something();
BlahEntities b = new BlahEntities()    
b.AddToSomethingSet(something);
b.SaveChanges();

トランザクション内でその追加をどのように実行しますか?

受け入れられた回答

コードをTransactionスコープ内に配置することができます

using(TransactionScope scope = new TransactionScope())
{
    // Your code
    scope.Complete(); //  To commit.
}

TransactionScopeは、同じ名前のアセンブリ内にあるSystem.Transactions名前空間にあります(プロジェクトに手動で追加する必要があるかもしれません)。


人気のある回答

ObjectContextには、トランザクションを管理するために使用できる接続プロパティがあります。

using (var context = new BlahEntities())
using (var tx = context.BeginTransaction())
{
    // do db stuff here...
    tx.Commit();
}

例外の場合、トランザクションはロールバックされます。 BeginTransaction()の呼び出しには接続を開く必要があるため、BeginTransactionの呼び出しを拡張メソッドでラップすることが理にかなっています。

public static DbTransaction BeginTransaction(this ObjectContext context)
{
    if (context.Connection.State != ConnectionState.Open)
    {
        context.Connection.Open();
    }
    return context.Connection.BeginTransaction();
}

私がこのアプローチがTransactionScopeよりも有用であると私が思う1つのシナリオは、あなたが2つのデータソースにアクセスしなければならなくて、接続の1つに対するトランザクション制御だけを必要とするときです。その場合、TransactionScopeは要求されていないかもしれない分散トランザクションに昇格すると思います。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ