2015-07-20 101 views
5

我的數據庫中有一個指向3個子數據庫實例的上下文。我通過上下文的構造函數注入正確的db連接字符串。EF具有一個上下文的多個數據庫

但是,我很難得到這個工作與自動遷移。問題是,自動遷移需要一個無參數的構造函數,我無法提供,IDbContextFactory只允許我返回一個連接字符串。

有沒有一種方法,我可以得到遷移腳本對多個數據庫運行,或者我需要創建3度獨立的環境中?

+0

只是要清楚,你用一個EF環境中使用相同的架構來連接到數據庫的3種不同的情況下,你希望上下文能夠維護所有3個實例的升級路徑? – Tr1stan

+0

是的!當它試圖做自動遷移似乎只允許我指定一個連接字符串。 – heymega

+0

如果@ Tr1stan說的是正確的,那麼我如何處理的是'public CustomContext() :base(DbConnections.GetCurrentConnectionString) { }'這樣做的是你的上下文仍然有一個無參數的構造函數,但連接字符串將取決於先前設置的任何標準(對於我來說,用戶選擇dev,test,prod) – SpaceSteak

回答

5

上下文的每個實例都有一個數據庫連接。

假設每個子數據庫WILLE有相同的代碼,第一個模型,可以爲每個數據庫啓動相同的上下文類的一個實例。

只需撥打DbContext.Initialize(真)遷移數據庫,然後關閉連接。

var context1 = new MigratorContext(connectionString1); 
context1.Initilialize(true); 
var context2 = new MigratorContext(connectionString2); 
context2.Initilialize(true); 
var context3 = new MigratorContext(connectionString3); 
context3.Initilialize(true); 

添加一個構造MigratorContext以連接字符串:

public MigratorContext(string connString) 
    : base(connString) 
{ 
    var migrationConfiguration = new MigrationConf(); 

    Database.SetInitializer<MigratorContext>(
     new MigrateDatabaseToLatestVersion< 
      MigratorContext, MigrationConf>(true, migrationConfiguration)); 
} 

public sealed class MigrationConf : DbMigrationsConfiguration<MigratorContext> 
{ 
    public MigrationConf() 
     : base() 
    { 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = true; 
    } 
} 
+0

嗯,可以工作 - 你會在哪裏建議初始化MVC應用程序中的3個dbcontexts? – heymega

+0

它可以在啓動時或應用程序需要使用持久性時初始化。這些上下文由控制器使用,但上下文取決於模型,因此可能是控制器層和模型層之間的持久層。 – abreneliere

+0

對遲到的反應抱歉 - 我確實設法讓這個工作,所以謝謝你的幫助。這裏的技巧是將MigrateDatabaseToLatestVersion的useSuppliedContext設置爲true,否則它會期望一個空構造器。 – heymega