1

现在我使用的是 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”。迁移用这个 ContextKey 查询 __MigrationHistory 表,发现没有数据。所以它会再次创建映射到ArticleDbContext中定义的模型的所有表,但是这些表已经存在于数据库中,所以会抛出异常,并告诉我“表XXX已经存在”。

我该如何解决这个问题?

4

1 回答 1

5

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

As an alternative to the Migrations initializer, you can also apply migrations using the DbMigrator.Update method. This is useful if you want to create/update the database before it would otherwise be triggered by the initializer.

于 2012-11-14T17:21:04.433 回答