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

时间:2015-07-14 14:42:47

标签: entity-framework entity-framework-6

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

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

  

类型'System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException'的例外   发生在EntityFramework.dll中但未在用户代码中处理

     

其他信息:无法更新数据库以匹配当前模型,因为有待处理的更改并且是自动的   迁移已禁用。将待处理的模型更改写入a   基于代码的迁移或启用自动迁移。组   DbMigrationsConfiguration.AutomaticMigrationsEnabled为true以启用   自动迁移。

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

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

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

    public MyContext()
    {
        Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
    }
}

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

public class DatabaseConfiguration : DbMigrationsConfiguration<MyContext>
{
    public DatabaseConfiguration()
    {
        this.AutomaticMigrationsEnabled = false;
    }
}

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

非常感谢满足这些需求的任何见解或替代选择。谢谢!

1 个答案:

答案 0 :(得分:5)

也许你可以......

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

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

  3. 修改

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

      

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

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

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