在禁用自动迁移的实体框架6中自动创建数据库

Mat*_*nze 3 entity-framework entity-framework-6

我希望能够自动创建一个新数据库,如果它不存在,使用代码优先EF6但禁用自动迁移.

如果我没记错,在实体框架中存在自动迁移之前,这样就可以了.但是,在EF6中,我收到以下异常:

EntityFramework.dll中出现"System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException"类型的例外,但未在用户代码中处理

附加信息:无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移.将挂起的模型更改写入基于代码的迁移或启用自动迁移.将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移.

为了验证此异常不是由我的生产项目中的外部因素引起的,我创建了一个新的测试项目.但是,我得到了同样的例外.

对于我的数据库上下文,我有:

public class MyContext : DbContext
{
    public DbSet<Entity> Entities { get; set; }

    public MyContext()
    {
        Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我添加了数据库迁移配置文件以禁用自动迁移:

public class DatabaseConfiguration : DbMigrationsConfiguration<MyContext>
{
    public DatabaseConfiguration()
    {
        this.AutomaticMigrationsEnabled = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我只需要能够创建一个新数据库(如果不存在)(因此我可以快速删除并重新创建一个新数据库,以便在我的开发机器上快速开发).但是,我不想启用自动迁移,因为我们使用第三方工具进行生产中的迁移,并且如果在启用自动迁移时架构已更改,EF6会抱怨.

任何满足这些需求的见解或替代选择都将不胜感激.谢谢!

jjj*_*jjj 5

也许你可以...

  1. 将数据库初始化程序设置为null(禁用模型兼容性检查)

    public class MyContext : DbContext
    {
        static MyContext()
        {
            Database.SetInitializer<MyContext>(null);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. MyContext.Database.CreateIfNotExists()在您选择的适当时间明确致电.


编辑

如果您没有使用Code First Migrations,看起来您需要删除DbMigrationsConfiguration:

在运行时,Code First会查找DbMigrationsConfiguration类,该类在上下文通过其数据库初始化过程时与上下文绑定.如果找到该类,则任何显式调用或设置将数据库初始化设置为任何原始三个初始化程序(其作业是创建或删除并创建数据库)将使用迁移创建数据库.

https://msdn.microsoft.com/en-us/magazine/dn818489.aspx

即使您不使用初始化程序,我也认为它必须做同样的事情.