EF Code第一个数据库/表初始化 - 什么时候发生?

时间:2011-10-13 12:57:39

标签: entity-framework-4 entity-framework-4.1 entity

我的应用程序使用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(请参阅上面的选项列表),以便我可以记录更改原因?...

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

1 个答案:

答案 0 :(得分:2)

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

  • 对于DropCreateDatabaseAlwaysCreateDatabaseIfNotExists,他们的名字清楚地表明了他们的所作所为。

  • 对于DropCreateDatabaseIfModelChanges,只有模型是否更改才会出现问题。 EF通过将模型散列与存储在数据库中的散列进行比较来检测此情况。您可以通过致电...

    自行检查
    bool compatible = context.Database.CompatibleWithModel(true);
    

    ...在您的自定义InitializeDatabase中,然后根据结果决定是否要发送SqlCommands。 (不要使用自创context来调用它,因为在检查模型兼容性之前,它将导致数据库首先初始化。)参数bool throwIfNoMetadata(其中在我的示例中是true导致EF在数据库中的模型哈希不存在时抛出异常。否则,在这种情况下,该方法将返回true

  • 对于自定义内部初始值设定项:无论您的代码是什么。