[英]UnitOfWork with Entity Framework is not committing the transaction
我有一个已经开始并提交的UoW
类别,如下所示
public class uow
{
private IDBcontext mydbcontext;
TransactionScope trans = null;
public uow(IDBConext mydbcontext)
{
this.mydbcontext = mydbcontext;
}
public void starttran()
{
if (trans == null)
trans = new TransactionScope(TransactionScopeAsyncFlowOption.enabled);
}
public async task Commit()
{
var mydb = mydbcontext as IObjectContextAdapter;
if (mydb != null)
await mydb.ObjextContext.SaveChangesAsync(SaveOptions.DetectChangesBeforeSave);
if (trans!=null)
{
trans.Complete();
trans = new TransactionScope();
}
mydb.ObjectContext.AcceptAllChanges();
}
}
现在,在我的实现中,我将2条记录插入2个不同的表中,并取回键值。 然后,我用这两个键在第三张表中执行另一个插入操作。
如果第二个或第三个插入失败,则我需要能够回滚第一个或前两个插入(插入应该全部成功,或者全部应该失败)。
Table1 tab1 = new Table1();
Table2 tab2 = new Table2();
Table3 tab3 = new Table3();
UOW uw = new UOW(mydbcontext);
uw.Starttran();
tab1.createdby = "user1";
tab1.name = "name";
tab1 = mydbcontext.Table1.Add(tab1);
await mydbcontext.SaveChangesAsync();
tab2.createdby = "user1";
tab2.name = "name";
tab2 = mydbcontext.Table2.Add(tab2);
await mydbcontext.SaveChangesAsync();
tab3.table1Id = tab1.Id;
tab3.table2Id = tab2.Id;
tab3 = mydbcontext.Table3.Add(tab3);
await mydbcontext.SaveChangesAsync();
if(tab3.Id > 0)
await uow.Commit();
else
await uow.RollBack();
我的问题是:事务未提交。 正如我调试所看到的,可以tab3.Id
创建tab3.Id
值,并且它是有效的。 但是当我查询我的SQL Server表时,它显示了一个锁,并且不返回任何查询结果。 当我手动关闭调试会话时,没有锁定-但是新记录不存在/未插入。
我在这里做错了什么? 在uow上读取多个线程,找不到答案。
commit
方法返回一个Waiting Task
,因此由于未等待调用,因此该程序可能会继续运行,甚至在调用完成之前就已完成。 在实施的最后部分,您应该执行以下操作:
if(tab3.Id > 0)
await uow.Commit();
else
await uow.RollBack(); // Assuming that this one is also an async method
一个好的做法是将前缀Async
添加到支持async-await的方法中。
另外,与问题无关,但在提交事务时,为什么要创建新的事务范围? 似乎没有必要,并且按照工作单元模式定义,一旦提交更改,就不应重复使用工作单元。
if (trans!=null)
{
trans.Complete();
trans = new TransactionScope(); // ???
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.