在同一连接中,在实体框架命令之前执行SQL命令

时间:2018-07-30 22:30:24

标签: asp.net sql-server entity-framework

我有一个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");

但是它不起作用,可能使用了不同的连接。

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

1 个答案:

答案 0 :(得分:0)

如@Laughing Vergil所述,您可以在DbContext运行查询之前访问连接对象。如果您在EF Core中使用db.Database.Connection.Open() EF6或db.Database.OpenConnection(),则该连接将在DbContext的整个生命周期内保持打开状态。因此,您可以设置连接属性,直接在Connection上使用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();
}