如何将SaveChanges和多个SQL命令合并到Entity Framework 6中的单个sp_executesql中

时间:2017-07-04 09:54:09

标签: c# entity-framework entity-framework-6

我在DbContext类中有以下代码:

public partial class MyEntities : DbContext
{
    public override int SaveChanges()
    {    
        Database.ExecuteSqlCommand("INSERT INTO Schema1.View ([Key],[Value]) VALUES('Flag', '1')"); //session #1?
        base.SaveChanges(); //session #2? :(
    }
}

当我使用Profiler检查时,我看到了:

enter image description here

我打算只有一个会话(意味着我在sp_reset_connectionINSERT INTO命令之间不能sp_executesql - 由SaveChanges生成调用)

所以我尝试了以下内容:

      using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
      {
        Database.ExecuteSqlCommand("INSERT INTO Schema1.View ([Key],[Value]) VALUES('Flag', '1')"); //session #1?
        //Database.ExecuteSqlCommand(TransactionalBehavior.EnsureTransaction,"INSERT INTO Schema1.View ([Key],[Value]) VALUES('Flag', '1')"); //session #1?
        base.SaveChanges(); //session #2? :(    
        scope.Complete();
      }

它没有改变任何东西。

我也尝试了这个:

using (var tr = Database.Connection.BeginTransaction())
{
...
}

抛出连接关闭的异常。

我还应该尝试什么?我可以将INSERT注入SaveChanges代码吗?

1 个答案:

答案 0 :(得分:2)

我认为在数据库事务中包装自定义SQL命令和基本SaveChanges调用是正确执行所需操作的方法。

但是,您不应使用基础BeginTransaction的{​​{1}}方法,而是需要手动打开/关闭它,您应该使用enter image description here方法为您进行连接管理:

DbConnection