实体框架 6 代码优先迁移的上下文键



现在我使用的是EF6 Alpha,在使用迁移时,它会在__MigrationHistory表中添加一个新的迁移日志。

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

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

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

    public ArticleDbContext()
    {   
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<ArticleDbContext, ArticleConfiguration>());
    }
    

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

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

我该如何解决这个问题?

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

作为迁移初始值设定项的替代方案,您还可以使用DbMigrator.Update方法应用迁移。如果您希望在初始化器触发数据库之前创建/更新数据库,这将非常有用。

最新更新