如何使用Entity Framework進行交易?

entity-framework transactions

當你有這樣的代碼:

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

如何在交易中運行該添加?

一般承認的答案

您可以將代碼放在事務範圍內

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有用的一種情況是,當您必須訪問兩個數據源並且只需要對其中一個連接進行事務控制時。我認為在這種情況下,TransactionScope將推廣到可能不需要的分佈式事務。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因