代码之家  ›  专栏  ›  技术社区  ›  Soul_Master

为什么Entity Framework 4.0需要使用DTM?可以不使用吗?

  •  1
  • Soul_Master  · 技术社区  · 14 年前

    我用英孚差不多一年前。我只是想用 交易范围 处理相当复杂的查询,如下面的代码。

    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服务?

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

    谢谢,

    1 回复  |  直到 14 年前
        1
  •  2
  •   Community CDub    8 年前

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

    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?

    推荐文章