【问题标题】:Why does Entity Framework 4.0 require using DTM? Is it possible to do not use it?为什么 Entity Framework 4.0 需要使用 DTM?可以不使用吗?
【发布时间】:2010-11-02 10:41:00
【问题描述】:

我大约一年前使用 EF。我只是尝试使用 TransactionScope 处理相当复杂的查询,如下面的代码。

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。当前工作的数据库是如此之小,我认为它不应该受到不同事务技术的影响。

谢谢,

【问题讨论】:

    标签: entity-framework-4 distributed-transactions


    【解决方案1】:

    搜索了很多网站后,我发现我可以使用实体事务手动创建事务,如下源代码。

    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();
    }
    

    助手类

    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?

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 2017-04-22
      • 2022-01-13
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      相关资源
      最近更新 更多