【问题标题】:Adding code to Entity Framework 6 model that runs whenever a new model context is instantiated向 Entity Framework 6 模型添加代码,该模型在实例化新模型上下文时运行
【发布时间】:2015-02-21 18:25:41
【问题描述】:

我正在使用 EF6 和最新版本的 SQLite EF6 提供程序。每当实例化新模型上下文并打开连接时,我都需要执行一条 PRAGMA 语句。

EF6 是否有某种机制允许我这样做?还是我要在模型用于检查 PRAGMA 并将其设置为所需值的任何地方修改我的代码?请注意,没有与此 PRAGMA 对应的连接字符串属性,否则我会在那里进行。

编辑 为了完整起见,这不是代码优先模型。这是一个数据库优先模型。我知道上下文类是部分的。是否可以在上下文的部分文件中添加自定义构造函数,然后我只需要调用它而不是默认构造函数?

【问题讨论】:

  • 构造函数中的自定义代码?
  • 你是在问我还是告诉我?如何在构造函数中添加自定义代码?
  • @TonyVitabile 你确实有某种 DbContext 类,不是吗?
  • 您需要运行什么 PRAGMA?可能有办法在连接字符串中指定它
  • 我需要运行busy_timeout pragma。我已经检查了文档,这不在 ConnectionStringBuilder 类的属性中。它也没有列在 SQLiteConnection 类文档的允许值列表中。

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


【解决方案1】:

实际问题是每次打开连接时都需要运行PRAGMA,而不是在创建上下文时。 PRAGMA 语句或任何 SQL 语句只能在连接打开后执行。当您显式调用 Open 或在保存更改时隐式调用时会发生这种情况。

您可以将事件处理程序附加到 Connection.StateChange 事件,如 SO question 所示:

db.Connection.StateChange += ConnectionStateChange;

void ConnectionStateChange(object sender, System.Data.StateChangeEventArgs e)
{
    if (e.CurrentState == System.Data.ConnectionState.Open) 
         db.ExecuteStoreCommand("PRAGMA foreign_keys = true;");            
}

【讨论】:

  • 这看起来很有希望。这段代码会去哪里?它可以进入实体模型的部分文件吗?我过去使用过 EF 4,但我对 EF6 很陌生,我不熟悉两者之间的区别。
  • 您可以在部分文件中添加自定义构造函数并调用它而不是默认构造函数之一,注意使用:base() 语句调用默认构造函数
  • 如这些 cmets 中所讨论的,是否可以更新答案,详细说明在哪里放置此代码?
猜你喜欢
  • 1970-01-01
  • 2020-02-25
  • 2014-11-07
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多