實體框架6 Code First Migration的ContextKey

entity-framework entity-framework-6

現在我正在使用EF6 Alpha,並且在使用遷移時,它會將新的遷移日誌添加到__MigrationHistory表中。

在EF6中,__ MigigrationHistory表有一個名為“ContextKey”的新列。經過測試,我發現有兩個默認的“ContextKey”值:

  1. DbContext的派生類的全名。當我運行代碼時會發生這種情況:

    Database.CreateIfNotExists();
    
  2. DbMigrationsConfiguration的派生類的全名。當我運行代碼時會發生這種情況:

    Database.CreateIfNotExists();
    

我第一次運行應用程序,“Database.CreateIfNotExists();”為我創建一個新數據庫,也是映射到ArticleDbContext中定義的模型的所有表,然後添加一個__MigrationHistory行,其中ContextKey的值為“Module.Article.Model.ArticleDbContext”。

然後“Database.SetInitializer(new MigrateDatabaseToLatestVersion());”將運行,此代碼將生成一個新的ContextKey“PowerEasy.Module.Article.Migrations.ArticleConfiguration”。遷移使用此ContextKey查詢__MigrationHistory表並找出沒有數據。因此,它將再次創建映射到ArticleDbContext中定義的模型的所有表,但這些表已經存在於數據庫中,因此將拋出異常,並告訴我“表XXX已經存在”。

我怎麼解決這個問題?

一般承認的答案

您不應該混合遷移和Database.CreateIfNotExists方法(或在其上構建的任何初始化程序)。如果數據庫尚不存在,遷移將負責創建數據庫。

作為Migrations初始化程序的替代方法,您還可以使用DbMigrator.Update方法應用遷移。如果要在初始化程序觸發之前創建/更新數據庫,這將非常有用。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因