2012-11-14 35 views
1

现在,我使用EF6的Alpha,并使用迁移时,它会添加一个新的迁移日志到__MigrationHistory表。实体框架6码第一次迁徙的ContextKey

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

  1. 当我运行代码的DbContext的派生class.This全称发生:

    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已存在”。

我怎样才能解决这个问题?

回答

5

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

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

+0

非常感谢你,我已经解决了它。 – RongieZeng