2011-09-14 24 views
1

我是TransactionScope的新手。我只想確保我在下面的代碼中所做的是正確的。EF4中的TransactionScope的幫助

private void DoSomeWork() 
{ 
    using (var context = new MyEntities()) 
    using (TransactionScope scope = new TransactionScope()) 
    { 
     context.Connection.Open(); 

     int ID = context.CallUpdateStoredProc(); 

     RecursiveDelete((EntityConnection)context.Connection, ID); 

     context.Connection.Close(); 

     scope.Complete(); 
    } 
} 

private void RecursiveDelete(EntityConnection connection,int someID) 
{ 
    using (var context = new MyEntities(connection)) 
    { 
     var UpdatedLinks = context.CallSaveStoredProc(someID).ToList(); 

     foreach (int UpdatedLink in UpdatedLinks) 
     { 
      RecursiveDelete(connection,UpdatedLink);  
     } 
    } 
} 

回答

0

在你如何使用TransactionScope class而言,是的,這是正確的,您通常使用的模式:

// Use overloads of constructor if you need to fine-tune the transaction 
using (var tx = new TransactionScope()) 
{ 
    // Do your work. 

    // Call Complete if the work is truly complete. 
    // Note, if you determine through logic, you don't 
    // have to call Complete. 
    tx.Complete(); 
} 

一旦你撥打Complete method,它將表明CURENT Transaction準備做出承諾。請注意,交易在致電Complete時未提交,但是在處置TransactionScope時。

從文檔TransactionScope.Complete

如果TransactionScope的對象創建的 事務資源經理之間提交的實際工作發生在 最終使用的語句。

此外,正如示例代碼中的註釋所示,這是一個有意識的決定,是否應該致電Complete

再次,從TransactionScope.Complete(重點煤礦)的文檔:

當您滿意該範圍內的所有操作都 成功完成,您應該調用此方法僅一次 通知事務管理器認爲跨所有資源的狀態是 一致,並且事務可以被提交。現在

,至於是否能TransactionScope與實體框架使用,答案是肯定的,因爲在MSDN文檔標題爲"How to: Manage Transactions in the Entity Framework"表示。