为什么Entity Framework 4.0需要使用DTM?有没有可能不使用它?

问题描述:

大约一年前我使用EF。我只是尝试使用TransactionScope处理相当复杂的查询,如下面的代码。为什么Entity Framework 4.0需要使用DTM?有没有可能不使用它?

using (var tran = new TransactionScope()) 
{ 
    // Clear all data in some table 
    DataContext.SomeTables 
     .ForEach(x => DataContext.SomeTables.DeleteObject(x)); 

    DataContext.SaveChanges(); 

    // Import data from excel as DataSet object. 
    var ds = ImportDataFromExcel(file.FullName); 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     DataContext.SomeTables.AddObject(new SomeTable 
     { 
      // fill object with data from current row. 
     }); 
    } 

    DataContext.SaveChanges(); 

    // Commit Transaction 
    tran.Complete(); 
} 

之后,我得到了一些有关DTM的错误未启用或无法访问。我知道它是由数据库服务器上的此服务引起的,不是由防火墙启动或阻止的。但这不是我的观点。

我想知道为什么EF使用此服务创建事务,而普通的SQL脚本只能使用像“BEGIN TRAN”,“SAVE TRAN”或“ROLLBACK TRAN”这样的语句。

有没有其他方法可以避免为我非常简单的事务处理语句调用DTM服务?

PS。目前的工作数据库非常小,我认为它不应该受到不同交易技术的影响。

感谢,

后,我查了很多网站,我发现我可以使用实体交易,如下面的源代码手动创建的交易。

using (var tran = DataContext.BeginTransaction()) 
{ 
    // Clear all data in some table 
    DataContext.SomeTables 
     .ForEach(x => DataContext.SomeTables.DeleteObject(x)); 

    DataContext.SaveChanges(); 

    // Import data from excel as DataSet object. 
    var ds = ImportDataFromExcel(file.FullName); 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     DataContext.SomeTables.AddObject(new SomeTable 
     { 
      // fill object with data from current row. 
     }); 
    } 

    DataContext.SaveChanges(); 

    // Commit Transaction 
    tran.Commit(); 
} 

Helper类

public static DbTransaction BeginTransaction(this ObjectContext context, IsolationLevel isolationLevel = IsolationLevel.ReadCommitted) 
{ 
    if (context.Connection.State != ConnectionState.Open) 
    { 
     context.Connection.Open(); 
    } 

    return context.Connection.BeginTransaction(isolationLevel); 
} 

感谢到Kim Major回答以下问题。我找不到任何其他页面清楚地表明我使用实体交易,包括主要MSDN网站(How to: Manage Transactions in the Entity Framework)。

How to use transactions with the Entity Framework?