2

我目前擁有一個包含實體框架6 Code First模型,DbContext和Migrations的asp.net MVC 4應用程序。爲了將其與我的Web應用程序分開,以便我可以在另一個項目中重新使用這些數據庫類,我已將所有相關的實體框架類移至其自己的項目。將實體框架從MVC移動到另一個項目會導致重新遷移

但現在,當我運行該解決方案時,它認爲我的模型已更改,並嘗試再次運行我的所有遷移。這個問題似乎是在我使用SetInitializer,好像我註釋掉這條線我可以正常運行Web應用程序。

public static class DatabaseConfig 
{ 
    public static void Initialize() 
    { 
     System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<G5DataContext, Configuration>()); 

     // make sure the database is created before SimpleMembership is initialised 
     using (var db = new G5DataContext()) 
      db.Database.Initialize(true); 
    } 
} 

這是不是一個問題,直到我試圖移動所有的實體框架類。這是不可能的,還是我做了一些根本性錯誤?

回答

7

啓動時,EF6查詢退出數據庫中的遷移,存儲在__MigrationHistory表中。該表的一部分是一個上下文關鍵字,其中包含實體的名稱空間。

如果將所有內容移動到新的名稱空間,EF6不會識別任何以前運行的遷移,並嘗試重建數據庫。

一個快速解決方案是運行腳本以將__MigrationHistory表中的上下文鍵重命名爲新的名稱空間。從http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/

UPDATE [dbo].[__MigrationHistory] 
    SET [ContextKey] = 'New_Namespace.Migrations.Configuration' 
WHERE [ContextKey] = 'Old_Namespace.Migrations.Configuration' 
+0

啊啊優秀。我會放棄這一點。謝謝。 – dreza

1

還想補充一點,你應該記得在你的配置類中更改ContextKey屬性。我做了上述,但它仍然試圖創建一個新的數據庫。這裏有一個例子:

前:

internal sealed class Configuration : DbMigrationsConfiguration<PricedNotesContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     ContextKey = "Synapse.DAL.PricedNotesContext"; 
    } 

    protected override void Seed(PricedNotesContext context) 
    { 
    } 
} 

後:

internal sealed class Configuration : DbMigrationsConfiguration<PricedNotesContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     ContextKey = "SynapseDomain.DAL.PricedNotesContext"; 
    } 

    protected override void Seed(PricedNotesContext context) 
    { 
    } 
} 

希望這有助於人誰是停留在此。這是一個恥辱,它不應該更容易...

相關問題