Entity framework 4 EF代码首次数据库/表初始化-何时发生?
我的应用程序是使用EF代码优先设计,所有的工作通常都很好 通过一个私有配置文件,我可以指定我希望EF如何处理对db模式的更改,从而根据需要创建/重新创建相关表-选项有“从不”、“创建”、“始终”、“onSchemaChanged”和(将来)“onSchemaModified” 这很有效,但我在几个地方迷路了 在开发过程中,我希望使用中描述的钩子 “-但这似乎在我的程序每次运行时都会执行” 所以..我的问题是:是否有一个覆盖,我可以用来检测EF是否真的会试图修改数据库,这样我就可以在需要时设置这个单用户的东西?如果是,我可以检测EF这样做的原因(见我上面的选项列表),这样我就可以记录更改的原因吗Entity framework 4 EF代码首次数据库/表初始化-何时发生?,entity-framework-4,entity-framework-4.1,entity,Entity Framework 4,Entity Framework 4.1,Entity,我的应用程序是使用EF代码优先设计,所有的工作通常都很好 通过一个私有配置文件,我可以指定我希望EF如何处理对db模式的更改,从而根据需要创建/重新创建相关表-选项有“从不”、“创建”、“始终”、“onSchemaChanged”和(将来)“onSchemaModified” 这很有效,但我在几个地方迷路了 在开发过程中,我希望使用中描述的钩子 “-但这似乎在我的程序每次运行时都会执行” 所以..我的问题是:是否有一个覆盖,我可以用来检测EF是否真的会试图修改数据库,这样我就可以在需要时设置这个
非常感谢所有帮助和建议。除非您已将数据库初始化器设置为
null
当您第一次使用上下文时,初始化器始终运行一次(每个应用程序生命周期)。然后实际发生的情况取决于初始化器(您的内部\u初始化器
):
- 对于
和DropCreateDatabaseAlways
来说,他们的名字很清楚他们在做什么CreateDatabaseIfNotExists
- 对于
,只有模型是否更改的问题。EF通过比较模型散列与数据库中存储的散列来检测此问题。您可以通过调用DropCreateDatabaseIfModelChanges
…在自定义的bool compatible=context.Database.CompatibleWithModel(true);
,然后根据结果决定是否发送SqlCommands。(不要使用自行创建的初始化数据库中
上下文调用它,因为这将导致在检查模型兼容性之前首先初始化数据库。)参数
(在我的示例中是bool throwIfNoMetadata
)如果数据库中的模型哈希不存在,则会导致EF抛出异常。否则,在这种情况下,该方法将返回true
true
- 对于自定义内部初始值设定项:无论您的代码将执行什么操作
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")
}