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
):
对于DropCreateDatabaseAlways
和CreateDatabaseIfNotExists
,他们的名字一目了然。
对于DropCreateDatabaseIfModelChanges
,只有模型是否更改的问题。 EF 通过将模型散列与存储在数据库中的散列进行比较来检测这一点。您可以通过致电...自行检查...
bool compatible = context.Database.CompatibleWithModel(true);
...在您的自定义InitializeDatabase
中,然后根据结果决定是否要发送 SqlCommands。 (不要用自己创建的context
调用它,因为它会导致在检查模型兼容性之前首先初始化数据库。)参数bool throwIfNoMetadata
(即true
在我的示例中)如果数据库中的模型哈希不存在,则会导致 EF 引发异常。否则在这种情况下该方法将返回true
。
对于自定义内部初始化程序:无论您的代码做什么。
【讨论】:
以上是关于EF 代码优先数据库/表初始化 - 何时发生?的主要内容,如果未能解决你的问题,请参考以下文章