2016-01-01 66 views
1

我有一個UoW類,它具有啓動和提交如下的UnitOfWork實體框架不提交事務

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多個線程,無法找到答案..

+0

您確定此代碼正在編譯?有一些方法是不存在的,你打電話 –

+0

對不起 - 我沒有寫回滾的主體,因爲它在這裏是無關的......但我確實有它 – jdoe

+0

我實際上使用await uow.Commit() ..當我在這裏輸入它時,就會顯示錯誤.. – jdoe

回答

1

commit方法返回一個awaitable Task,是因爲呼叫等待不是,該程序可能會繼續運行,並調用完成前甚至完成。在您的實現的最後一部分喲應該做的:

if(tab3.Id > 0) 
    await uow.Commit(); 
else 
    await uow.RollBack(); // Assuming that this one is also an async method 

一個好的做法是,以前綴Async添加到支持異步等待的方法。

另外,但是與問題無關,當您提交您的事務時,您爲什麼要創建新的事務範圍?似乎沒有必要,並且通過工作單元模式定義,一旦變更被提交,就不應該重新使用工作單元。

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

'await'不執行任務。如果服務員沒有完成,它只會讓控制權返回給調用者。 –

+0

我實際上使用await uow.Commit()..它不起作用..我錯過了它,當我在這裏鍵入它..我可以更新我的帖子來反映它嗎? – jdoe

+0

是的!這是一個很好的指針保羅..我能做些什麼來執行它在這裏!嗯..我玩這個提示。 – jdoe