2012-04-24 64 views
0

我在數據層加入多個事務跨實例EF連接

namespace DAL 
{ 
    public abstract class BaseDalObj:IDisposable 
    { 
     protected Auto.Entities entities; 
     public BaseDalObj() 
     { 
      entities= new Auto.Entities(); 
     } 
     public void Dispose() 
     { 
     } 
    } 
    public class Class1: BaseDalObj 
    { 
     public void Save(object a) 
     { 
      entities.SaveItem(a); 
     } 
    } 

    public class Class2: BaseDalObj 
    { 
     public void Save(object b) 
     { 
      entities.SaveItem(b); 
     } 
    } 
} 
namespace Business 
{ 
    public class BusinessLL 
    { 
     public Object a,b; 
     public BusinessDAL() 
     { 
      a = new Object(); 
      b = new Object(); 
     } 

     public void Save() 
     { 
       using(var dbObj1 = new DAL.Class1()) 
       { 
        dbObj1.Save(a); 
        using(var dbObj2 = new DAL.Class2()) 
        { 
         dbObj2.Save(b); 
        } 
       } 
     } 
    } 
} 

以下設置什麼,我想一些方法來調用都保存功能,但同樣的TransactionScope內。

我不知道如何使用EF做到這一點。我已經研究過使用TransactionScope類,但是我無法理解它是如何工作的。

我一直在尋找使用entities.Connection.BeginTransaction()而是返回一個DbTransactionTransactionScope只接受Transaction型類

任何幫助,或者可以點我在正確的方式將真正幫助指針。

+0

什麼你不明白使用'TransactionScope'? – 2012-04-24 10:43:03

+0

@LadislavMrnka我不明白如何從一個實體實例獲取事務加入到TransactionScope,就好像我調用entities.Connection.BeginTransaction()它返回一個DBTransaction但TransactionScope只接受一個事務類。 我是否正確思考如果我調用Transaction.Current我會得到使用entities.Connection.BeginTransaction() – Qpirate 2012-04-24 10:51:38

+0

創建的事務TransactionScope將自己處理事務創建。你不需要做任何事情,但是當你在兩個上下文中同時執行時,它很可能會啓動分佈式事務,並且需要MSDTC。 – 2012-04-24 10:58:26

回答

1

如果在打開連接時存在環境事務,連接將自動登錄到此事務中。這也適用於ObjectContext - 當您調用ObjectContext.SaveChanges時,它會自動將連接引入到環境事務中。 因此,我認爲這應該工作:

using(var transaction = new TransactionScope) 
{ 
    using(var class1 = new Class1()) 
    { 
     class1.Save(x); 
    } 

    using(var class2 = new Class2()) 
    { 
     class2.Save(y); 
    } 

    transaction.Complete(); 
} 
+0

我會試一試,讓你知道會發生什麼 – Qpirate 2012-04-24 14:22:32

+0

嗨,我已經嘗試了你的建議,我認爲這是我走的路,但功能SaveItem是一個處理自定義保存部分的SP。我想問的是TransactionScope對象創建可以在數據庫中使用的事務。 抱歉不理解這些東西是如何融合在一起的。 我的SP看起來像這樣http://rusanu.com/2009/06/11/exception-handling-and-nested-transactions/ – Qpirate 2012-04-30 10:47:22

+0

我發現它失敗了,因爲我沒有刪除我的一個提交語句中的一個但是一旦我追溯了所有的提交語句和回滾聲明,它就完美地工作了,非常感謝你的幫助 – Qpirate 2012-05-02 18:10:03