2012-08-10 84 views
0

我們有一個現有的數據庫,包含一個用戶表和一個代碼庫(用VB.Net編寫),它實現了某些業務邏輯並處理向數據庫中添加「遺留用戶」記錄。我正在處理的項目現在需要創建一個新的實體(ExternalUser),它可以「擴展」用戶。我們選擇通過創建舊用戶記錄並將其與新表進行一對一關聯來實現新實體。當被要求創建一個新的ExternalUser時,UserRepository然後會調用遺留代碼來創建記錄的User部分,然後存儲庫將使用EF Code的第一個ExternalUserContext在ExternalUsers表中創建記錄。 當然,如果第二次調用因任何原因而失敗,我們希望將遺留用戶的創建逆轉。這是事情失敗的地方。我們正在使用SQL Server 2005和EF代碼4.3.1。下面是相關代碼:Code First Transaction wrapping

using (_context = new ExternalUserContext(Utils.ConnectionString)) 
{ 
    ObjectContext ob = ((IObjectContextAdapter) _context).ObjectContext; 
    ob.Connection.Open(); 
    DbTransaction tran = ob.Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted); 
    _legacyUser = new blUser(); 
    long id = _legacyUser.Add(//Params go here); 
    if (id > 0) 
    { 
     toCreate.UserID = id; 
     _context.ExternalUsers.Add(toCreate); 
     tran.Rollback(); //Just for testing 
     throw new FieldAccessException("testing"); //just for testing 
     _context.SaveChanges(); 
     tran.Commit(); 
     }else 
     { 
      throw new ArgumentException("Could not create legacy user"); 
     } 
} 

我已經使用TransactionScope嘗試(開始之前或實例化ExternalUserContext之後)試圖所有明確管理事務無濟於事了。引用的代碼會拋出錯誤,但用戶記錄仍保留在數據庫中。 VB代碼正在調用另一個用於創建實際記錄的.dll文件。這兩個dll都使用默認設置將創建包裝在TransactionScope中。

是否我的代碼正在調用一個dll,它本身正在調用執行數據庫事務的dll,在這裏扮演一個角色?任何幫助,將不勝感激。

回答

0

很遺憾地說,這是由於代碼碎片不好的情況。我的低級dll插入的源代碼不是用於生成我的項目引用的二進制文件。其中的區別在於事務處理範圍被定義爲RequiresNew。對不起,浪費了任何人的時間.....它仍然可以作爲一個例子,說明糟糕的版本控制會浪費一天的工作量!