我有一個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多個線程,無法找到答案..
您確定此代碼正在編譯?有一些方法是不存在的,你打電話 –
對不起 - 我沒有寫回滾的主體,因爲它在這裏是無關的......但我確實有它 – jdoe
我實際上使用await uow.Commit() ..當我在這裏輸入它時,就會顯示錯誤.. – jdoe