次のようなコードがあるとします。
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は要求されていないかもしれない分散トランザクションに昇格すると思います。