如何使用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合法吗? 是的,了解原因