我的应用程序使用EF代码优先设计,并且通常都能很好地运行。
通过私有配置文件,我可以指定我希望EF如何处理对数据库模式的更改,从而根据需要创建/重新创建相关表 - 选项是“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(请参阅上面的选项列表),以便我可以记录更改原因?...
非常感谢所有帮助和建议。
答案 0 :(得分:2)
除非您已将数据库初始化程序设置为null
初始化程序,否则当您第一次使用上下文时,运行总是一次(每个应用程序生命周期)。然后实际发生的事情取决于初始化程序(您的内部_intializer
):
对于DropCreateDatabaseAlways
和CreateDatabaseIfNotExists
,他们的名字清楚地表明了他们的所作所为。
对于DropCreateDatabaseIfModelChanges
,只有模型是否更改才会出现问题。 EF通过将模型散列与存储在数据库中的散列进行比较来检测此情况。您可以通过致电...
bool compatible = context.Database.CompatibleWithModel(true);
...在您的自定义InitializeDatabase
中,然后根据结果决定是否要发送SqlCommands。 (不要使用自创context
来调用它,因为在检查模型兼容性之前,它将导致数据库首先初始化。)参数bool throwIfNoMetadata
(其中在我的示例中是true
导致EF在数据库中的模型哈希不存在时抛出异常。否则,在这种情况下,该方法将返回true
。
对于自定义内部初始值设定项:无论您的代码是什么。