EF代码第一次数据库/表初始化 - 什么时候发生?
我的应用程序使用EF代码优先设计,所有的一般工作得很好。EF代码第一次数据库/表初始化 - 什么时候发生?
通过一个私有配置文件,我可以指定如何让EF处理对db模式的更改,并根据需要创建/重新创建相关表 - 这些选项是“never”,“create”,“always” ,“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东西何时需要?如果是这样,我可以检测到原因 EF正在执行所以(看我上面的选项列表),所以我可以登录更改的原因?...
非常感谢所有的帮助和建议。
除非您已将数据库初始化程序设置为null
初始化程序在第一次使用环境时运行总是一次(每个应用程序生存期)。那么,什么实际发生取决于初始化(你内心_intializer
):
对于
DropCreateDatabaseAlways
和CreateDatabaseIfNotExists
这是由他们的名字,他们做什么不清楚。-
对于
DropCreateDatabaseIfModelChanges
只有模型是否改变的问题。 EF通过将模型散列与存储在数据库中的散列进行比较来检测此情况。您可以自定义InitializeDatabase
内,如果你想送你SqlCommands或无法通过调用检查这个自己...bool compatible = context.Database.CompatibleWithModel(true);
...,然后再决定根据结果。 (不要用自己创建的
context
来调用它,因为在检查模型兼容性之前,它会首先初始化数据库。)参数bool throwIfNoMetadata
(在我的示例中为true
)会导致EF在引发异常时抛出异常if数据库中的模型哈希不存在。否则在这种情况下该方法将返回true
。 对于自定义内部初始值设定项:无论您的代码将执行什么操作。
非常好!这正是我正在寻找的 - 谢谢。 – JcMaltaDev