Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 4 EF代码首次数据库/表初始化-何时发生?_Entity Framework 4_Entity Framework 4.1_Entity - Fatal编程技术网

Entity framework 4 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是否真的会试图修改数据库,这样我就可以在需要时设置这个

我的应用程序是使用EF代码优先设计,所有的工作通常都很好

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

这很有效,但我在几个地方迷路了

在开发过程中,我希望使用中描述的钩子 “-但这似乎在我的程序每次运行时都会执行”

所以..我的问题是:是否有一个覆盖,我可以用来检测EF是否真的会试图修改数据库,这样我就可以在需要时设置这个单用户的东西?如果是,我可以检测EF这样做的原因(见我上面的选项列表),这样我就可以记录更改的原因吗


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

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

  • 对于
    DropCreateDatabaseAlways
    CreateDatabaseIfNotExists
    来说,他们的名字很清楚他们在做什么

  • 对于
    DropCreateDatabaseIfModelChanges
    ,只有模型是否更改的问题。EF通过比较模型散列与数据库中存储的散列来检测此问题。您可以通过调用

    bool compatible=context.Database.CompatibleWithModel(true);
    
    …在自定义的
    初始化数据库中
    ,然后根据结果决定是否发送SqlCommands。(不要使用自行创建的
    上下文调用它,因为这将导致在检查模型兼容性之前首先初始化数据库。)参数
    bool throwIfNoMetadata
    (在我的示例中是
    true
    )如果数据库中的模型哈希不存在,则会导致EF抛出异常。否则,在这种情况下,该方法将返回
    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")
    }