2011-10-13 92 views
0

我的应用程序使用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正在执行所以(看我上面的选项列表),所以我可以登录更改的原因?...

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

回答

2

除非您已将数据库初始化程序设置为null初始化程序在第一次使用环境时运行总是一次(每个应用程序生存期)。那么,什么实际发生取决于初始化(你内心_intializer):

  • 对于DropCreateDatabaseAlwaysCreateDatabaseIfNotExists这是由他们的名字,他们做什么不清楚。

  • 对于DropCreateDatabaseIfModelChanges只有模型是否改变的问题。 EF通过将模型散列与存储在数据库中的散列进行比较来检测此情况。您可以自定义InitializeDatabase内,如果你想送你SqlCommands或无法通过调用检查这个自己...

    bool compatible = context.Database.CompatibleWithModel(true); 
    

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

  • 对于自定义内部初始值设定项:无论您的代码将执行什么操作。

+0

非常好!这正是我正在寻找的 - 谢谢。 – JcMaltaDev