C# UnitOfWork with Entity Framework未提交事务

C# UnitOfWork with Entity Framework未提交事务,c#,sql-server,async-await,entity-framework-6,unit-of-work,C#,Sql Server,Async Await,Entity Framework 6,Unit Of Work,我有一个UoW类,它的start和commit如下 public class uow { private IDBcontext mydbcontext; TransactionScope trans = null; public uow(IDBConext mydbcontext) { this.mydbcontext = mydbcontext; } public void starttran() { i

我有一个
UoW
类,它的start和commit如下

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();
   }
}
现在在我的实现中,我将两条记录插入到两个不同的表中,并检索回键值。然后,我用这两个键在第三个表中执行另一次插入

如果第二次或第三次插入失败,我需要能够回滚第一次或前两次插入(插入应全部成功或全部失败)

我的问题是:事务没有提交。正如我调试时看到的那样,
tab3.Id
值是正确创建的,并且是有效的。但当我查询SQL Server表时,它会显示一个锁,并且不会返回任何查询结果。手动关闭调试会话时,没有锁定-但新记录不存在/未插入


我做错了什么?在此处读取uow上的多个线程,但找不到答案。

提交方法返回一个可等待的
任务
,因此,由于没有等待调用,程序可能会继续运行,甚至在调用完成之前完成。在实施的最后一部分中,您应该执行以下操作:

if(tab3.Id > 0)
  await uow.Commit();
else
  await uow.RollBack();  // Assuming that this one is also an async method
一个好的做法是将前缀
Async
添加到支持asyncwait的方法中

此外,但与问题无关,在提交事务时,为什么要创建新的事务范围?这似乎没有必要,根据工作单元模式的定义,一旦提交了更改,就不应该重新使用工作单元

if (trans!=null)
{
  trans.Complete();
  trans = new TransactionScope(); // ???
}

你确定这段代码正在编译吗??有一些方法是不存在的,您正在调用抱歉-我没有编写回滚的主体,因为它在这里是不相关的…但我确实有它..我确实使用了wait uow.Commit()…在这里键入时遗漏了..主题外,但相关:您只使用uow作为
TransactionScope
的包装器。你为什么不按计划使用呢?另外(再次讨论主题),如果您设置对象引用而不是外键值,则不需要在两者之间进行所有这些
savechangesync
调用。一个就可以了,您不必完全管理自己的事务。这可能就足够了。是否尝试设置对象引用而不是FK值?
wait
不执行该任务。如果等待程序未完成,它只会将控制权返回给调用方。实际上,我使用了wait uow.Commit()…但它不起作用。。我在这里打字时漏掉了。。我可以更新我的帖子来反映它吗?是的!!保罗,这是一个很好的指针。。我该怎么做才能在这里执行它!!嗯……让我来玩玩这个暗示吧。我一定是错过了什么。。不能让这个工作!请参见我的提交签名是异步任务提交()…它与void不同,对吧。。我想这就是关键所在。。
if (trans!=null)
{
  trans.Complete();
  trans = new TransactionScope(); // ???
}