EF 代码优先数据库/表初始化 - 何时发生?

Posted

技术标签:

【中文标题】EF 代码优先数据库/表初始化 - 何时发生?【英文标题】:EF Code first database/table initialization - WHEN does it happen? 【发布时间】:2011-10-13 12:57:38 【问题描述】:

我的应用程序使用的是 EF 代码优先设计,并且通常运行良好。

通过私有配置文件,我可以指定我希望 EF 如何处理对 db 架构的更改,从而根据需要创建/重新创建相关表 - 选项为“从不”“创建”、“始终”、 “onSchemaChanged”和(未来)“onSchemaModified”。

这很好用 - 但我在几个地方迷路了.....

在开发过程中,我想使用钩子,如 "Database in use error with Entity Framework 4 Code First" - 但这似乎在每次运行我的程序时都会执行"

 public void InitializeDatabase(Context context)
    
        context.Database.SqlCommand("ALTER DATABASE Tocrates SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
        _initializer.InitializeDatabase(context); // Maybe this does nothing if not needed
        context.Database.SqlCommand("ALTER DATABASE Tocrates SET MULTI_USER")
    

所以 .. 解决我的问题:是否有一个替代方法可以用来检测 EF 是否真的会尝试修改数据库,所以我可以在需要时设置这个 SINGLE_USER 内容?如果是这样,我是否可以检测到它这样做的 reason EF(请参阅上面的选项列表),以便我可以记录更改的原因?...

非常感谢所有帮助和建议。

【问题讨论】:

【参考方案1】:

除非您将数据库初始化程序设置为null,否则初始化程序在您首次使用上下文时始终运行一次(每个应用程序生命周期)。然后实际发生的情况取决于初始化程序(您的内部_intializer):

对于DropCreateDatabaseAlwaysCreateDatabaseIfNotExists,他们的名字一目了然。

对于DropCreateDatabaseIfModelChanges,只有模型是否更改的问题。 EF 通过将模型散列与存储在数据库中的散列进行比较来检测这一点。您可以通过致电...自行检查...

bool compatible = context.Database.CompatibleWithModel(true);

...在您的自定义InitializeDatabase 中,然后根据结果决定是否要发送 SqlCommands。 (不要用自己创建的context 调用它,因为它会导致在检查模型兼容性之前首先初始化数据库。)参数bool throwIfNoMetadata(即true在我的示例中)如果数据库中的模型哈希不存在,则会导致 EF 引发异常。否则在这种情况下该方法将返回true

对于自定义内部初始化程序:无论您的代码做什么。

【讨论】:

以上是关于EF 代码优先数据库/表初始化 - 何时发生?的主要内容,如果未能解决你的问题,请参考以下文章

ef4.4 code first数据库新增时 初始化表数据不成功

EF 代码优先 - 删除然后创建数据库后播种

EF6 使用列默认值创建代码优先表

不同表共享相同字段时如何设计EF Core代码优先数据库

EF 4.1 代码优先:多对多

EF数据库优先方法如何将新的非空列添加到生产表并在代码级别进行管理