首页 > 解决方案 > 在同一连接中,在实体框架命令之前执行 SQL 命令

问题描述

我有一个 ASP.NET MVC 应用程序首先通过 EF 代码访问现有数据库。该数据库来自一个已经存在的系统,我无法更改其结构或代码,只需插入记录即可。

所以我有一个DbContext对象要保存到实体:

using (MyContext db = new MyContext())
{ 
    MyEntity e = new MyEntity();
    e.MyProperty = "value";
    db.MyEntity.Add(e);

    db.SaveChanges();
}

问题是该MyEntity表有一个触发器,需要SET DATEFORMAT MDY运行才能正常工作。

所以这就是我的问题:如何在调用SaveChanges应用它生成的命令之前执行这个命令?我试过了

db.Database.ExecuteSqlCommand("set dateformat mdy");

但它没有用,它可能使用不同的连接。

如果可能,另一种选择是在连接字符串中设置此参数。

标签: asp.netsql-serverentity-framework

解决方案


正如@Laughing Vergil 所说,您可以在 DbContext 运行查询之前访问连接对象。如果您使用db.Database.Connection.Open()EF6 或db.Database.OpenConnection()EF Core,则连接将在 DbContext 的整个生命周期内保持打开状态。因此您可以设置连接属性,直接在连接上使用 ADO.NET 等。

您可以在 DbContext 构造函数中执行此操作以使其成为全局行为,或者针对特定方法,如下所示:

using (MyContext db = new MyContext())
{ 
    db.Database.Connection.Open(); //EF6
    //db.Database.OpenConnection(); //EF Core
    db.Database.ExecuteSqlCommand("set dateformat mdy");

    MyEntity e = new MyEntity();
    e.MyProperty = "value";
    db.MyEntity.Add(e);

    db.SaveChanges();
}

推荐阅读