Entity framework 显式调用数据库初始值设定项

Entity framework 显式调用数据库初始值设定项,entity-framework,ef-code-first,entity-framework-5,dbcontext,Entity Framework,Ef Code First,Entity Framework 5,Dbcontext,我在两个服务项目之间共享的程序集中有一个DbContext。我已将这两个项目设置为在VisualStudio中启动调试。这将创建一个竞争条件,其中每个服务中的数据库初始值设定项在启动时尝试更新数据库 为了防止这种情况,我修改了我的DbContext,如下所示,以防止自动注册databaseinitializer public EntityContext : DbContext { protected override void OnModelCreating(DbModelBuilder

我在两个服务项目之间共享的程序集中有一个DbContext。我已将这两个项目设置为在VisualStudio中启动调试。这将创建一个竞争条件,其中每个服务中的
数据库初始值设定项
在启动时尝试更新数据库

为了防止这种情况,我修改了我的
DbContext
,如下所示,以防止自动注册
databaseinitializer

public EntityContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<EntityContext>(null);
    }
}
问题是这似乎不起作用-在
OnModelCreating()
方法中设置的null初始值设定项显然会覆盖我在对
SetInitializer()的任何其他调用中指定的任何内容。即使我将
setInitializer(null)
调用移动到
EntityContext
类的静态构造函数,以保证它首先被调用,它仍然不起作用。它工作的唯一方法是我手动调用初始化器,如下所示:

static void Main(string[] args)
{
    new CreateDatabaseIfNotExists<EntityContext>()
        .InitializeDatabase(new EntityContext());
}
static void Main(字符串[]args)
{
新建CreateDatabaseIfNotExists()
.InitializeDatabase(新EntityContext());
}
但是直接调用
DatabaseInitializer.InitializeDatabase()
似乎不正确,因为实体框架基础结构应该调用它

这是EF代码中的错误吗?“正确”的方法是什么


更新:我决定使用
更新数据库
包管理器控制台命令手动创建数据库脚本是一个比这个试图以编程方式更新数据库的kludgey项目更好的解决方案。

只要在调用禁用后调用设置初始值设定项,这应该可以工作初始化器。在您的案例中,OnModelCreating或静态EntityContext初始值设定项都不会这样做。静态初始值设定项仅在您第一次使用EntityContext时才会被调用,在您的示例中,直到调用SetInitializer之后才会调用

您可以考虑在调用StimeRealAlgisher调用之前强制调用静态初始化器。例如,这应该起作用:

using (var context = new EntityContext())
{
    Database.SetInitializer(new CreateDatabaseIfNotExists<EntityContext>());
    context.Database.Initialize(true);
}
使用(var context=new EntityContext())
{
SetInitializer(新的CreateDatabaseIfNotExists());
context.Database.Initialize(true);
}

只要在调用禁用初始值设定项之后调用设置初始值设定项,该操作就应该有效。在您的案例中,OnModelCreating或静态EntityContext初始值设定项都不会这样做。静态初始值设定项仅在您第一次使用EntityContext时才会被调用,在您的示例中,直到调用SetInitializer之后才会调用

您可以考虑在调用StimeRealAlgisher调用之前强制调用静态初始化器。例如,这应该起作用:

using (var context = new EntityContext())
{
    Database.SetInitializer(new CreateDatabaseIfNotExists<EntityContext>());
    context.Database.Initialize(true);
}
使用(var context=new EntityContext())
{
SetInitializer(新的CreateDatabaseIfNotExists());
context.Database.Initialize(true);
}

漂亮的接球。。。但是,即使是这样的代码,也只有在我使用静态构造函数时才有效。原因是实际上是对
Initialize()
的调用触发了对
OnModelCreated()
的调用。我现在倾向于直接调用初始值设定项可以更好地表达我的意图。这是因为DbContext故意非常懒惰,在您以某种方式实际使用它之前,几乎不做任何工作,包括初始化。这意味着,在创建DbContext实例之前,您不必知道(从性能角度来看),您将使用DbContext,这可能非常有用。。。但是,即使是这样的代码,也只有在我使用静态构造函数时才有效。原因是实际上是对
Initialize()
的调用触发了对
OnModelCreated()
的调用。我现在倾向于直接调用初始值设定项可以更好地表达我的意图。这是因为DbContext故意非常懒惰,在您以某种方式实际使用它之前,几乎不做任何工作,包括初始化。这意味着在创建DbContext实例之前,您不必知道(从perf的角度来看)您将使用它,这可能非常有用。