pup*_*eno 27 entity-framework transactions
当你有这样的代码:
Something something = new Something();
BlahEntities b = new BlahEntities()
b.AddToSomethingSet(something);
b.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
如何在交易中运行该添加?
Kim*_*jor 55
ObjectContext具有可用于管理事务的连接属性.
using (var context = new BlahEntities())
using (var tx = context.BeginTransaction())
{
// do db stuff here...
tx.Commit();
}
Run Code Online (Sandbox Code Playgroud)
在异常情况下,事务将被回滚.因为对BeginTransaction()的调用需要和打开连接,所以在扩展方法中包含对BeginTransaction的调用是有意义的.
public static DbTransaction BeginTransaction(this ObjectContext context)
{
if (context.Connection.State != ConnectionState.Open)
{
context.Connection.Open();
}
return context.Connection.BeginTransaction();
}
Run Code Online (Sandbox Code Playgroud)
我相信这种方法可能比TransactionScope有用的一种情况是,当您必须访问两个数据源并且只需要对其中一个连接进行事务控制时.我认为在这种情况下,TransactionScope将推广到可能不需要的分布式事务.
Shi*_*iji 26
您可以将代码放在事务范围内
using(TransactionScope scope = new TransactionScope())
{
// Your code
scope.Complete(); // To commit.
}
Run Code Online (Sandbox Code Playgroud)
TransactionScope位于System.Transactions命名空间中,该命名空间位于同名程序集中(您可能需要手动将其添加到项目中).
我知道对于LINQ to SQL,如果没有现有的环境事务(TransactionScope是"环境"事务),数据上下文将为SubmitChanges()创建一个事务.我还没有看到LINQ to Entities的文档记录,但我已经看到行为表明它对于Entity Framework也是如此.
因此,只要您使用一个SubmitChanges()(L2SQL)或SaveChanges()(Linq to Entities)进行所有相关更改,您就可以在不使用TransactionScope的情况下使用.您何时需要TransactionScope
我在使用嵌套的TransactionScopes时遇到了麻烦.他们应该工作,简单的测试用例可以工作,但是当我进入生产代码时,"内部"事务似乎与外部事务是同一个对象.症状包括"事务已提交,您不能再使用此事务"或"此事务对象已被处置"的错误.内部事务完成其工作后,外部事务中会发生错误.