实体框架6 Code First Migration的ContextKey

Ron*_*eng 1 entity-framework entity-framework-6

现在我正在使用EF6 Alpha,并且在使用迁移时,它会将新的迁移日志添加到__MigrationHistory表中.

在EF6中,__ MigrationHistory表有一个名为"ContextKey"的新列.经过测试,我发现有两个默认的"ContextKey"值:

  1. DbContext的派生类的全名.当我运行代码时会发生这种情况:

    Database.CreateIfNotExists();
    
    Run Code Online (Sandbox Code Playgroud)
  2. DbMigrationsConfiguration的派生类的全名.当我运行代码时会发生这种情况:

    public ArticleDbContext()
    {   
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<ArticleDbContext, ArticleConfiguration>());
    }
    
    Run Code Online (Sandbox Code Playgroud)

我第一次运行应用程序,"Database.CreateIfNotExists();" 为我创建一个新数据库,也是映射到ArticleDbContext中定义的模型的所有表,然后添加一个__MigrationHistory行,其中ContextKey的值为"Module.Article.Model.ArticleDbContext".

然后"Database.SetInitializer(new MigrateDatabaseToLatestVersion());" 将运行,此代码将生成一个新的ContextKey"PowerEasy.Module.Article.Migrations.ArticleConfiguration".迁移使用此ContextKey查询__MigrationHistory表并找出没有数据.因此,它将再次创建映射到ArticleDbContext中定义的模型的所有表,但这些表已经存在于数据库中,因此将抛出异常,并告诉我"表XXX已经存在".

我怎么解决这个问题?

bri*_*lam 5

您不应该混合迁移和Database.CreateIfNotExists方法(或在其上构建的任何初始化程序).如果数据库尚不存在,迁移将负责创建数据库.

作为Migrations初始化程序的替代方法,您还可以使用DbMigrator.Update方法应用迁移.如果要在初始化程序触发之前创建/更新数据库,这将非常有用.