【问题标题】:Execute a SQL command before Entity Framework commands, in the same connection在同一连接中,在实体框架命令之前执行 SQL 命令
【发布时间】:2018-07-30 22:30:24
【问题描述】:

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

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

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

【问题讨论】:

  • 我很确定您需要明确使用 Connection 对象来执行此操作。默认情况下,EF 执行 Open / DoStuff / Close 连接过程。如果您使用 Connection 对象,则连接(以及您为连接设置的内容)将持续存在。
  • 您可以为您使用的登录设置默认语言,假定所需的日期格式,例如alter login [SVC_MyApp] with default_language = [us_english];。如果应用程序的其他部分不需要相反的情况,那就是。

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


【解决方案1】:

正如@Laughing Vergil 所说,您可以在 DbContext 运行查询之前访问连接对象。如果您在 EF Core 中使用 db.Database.Connection.Open() EF6 或 db.Database.OpenConnection(),则连接将在 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多