【发布时间】:2016-01-01 19:43:38
【问题描述】:
我有一个 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 值创建得很好并且它是有效的。但是当我查询我的 SQL Server 表时,它显示一个锁并且不返回任何查询结果。当我手动关闭调试会话时,没有锁定 - 但新记录不存在/未插入。
我在这里做错了什么?在此处阅读 uow 上的多个主题,但找不到答案..
【问题讨论】:
-
你确定这段代码正在编译吗?您正在调用的某些方法不存在
-
抱歉 - 我没有写回滚的正文,因为它在这里无关紧要......但我确实有......
-
我实际上确实使用了 await uow.Commit()..当我在这里输入时错过了..
-
离题,但相关:您只使用 UoW 作为
TransactionScope的包装。你为什么不按预期使用它?另外(再次回到主题),如果您设置对象引用而不是外键值,则不需要所有这些SaveChangesAsync调用。一个就可以了,而且您不必完全管理自己的交易。这可能足以让它正确。 -
您是否尝试设置对象引用而不是 FK 值?
标签: c# sql-server async-await entity-framework-6 unit-of-work