2015-07-20 99 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