EF单个上下文连接多个数据库

9

我在数据库中有一个上下文,指向3个子数据库实例。我通过上下文的构造函数注入正确的数据库连接字符串。

然而,我在使用自动迁移时遇到了困难。问题是,自动迁移需要一个无参数的构造函数,但我无法提供,而IDbContextFactory只允许我返回一个连接字符串。

是否有一种方法可以使迁移脚本针对多个数据库运行,或者我需要创建3个单独的上下文?


只是为了说明一下,您正在使用一个EF上下文连接到3个不同的数据库实例,这些实例使用相同的模式,并且您希望上下文能够维护所有3个实例的升级路径? - Tr1stan
是的,完全正确! 当它尝试执行自动迁移时,似乎只允许我指定单个连接字符串。 - heymega
如果@Tr1stan所说的是正确的,那么我该如何处理public CustomContext() : base(DbConnections.GetCurrentConnectionString) { }。这样做的效果是您的上下文仍将具有无参数构造函数,但连接字符串将取决于先前设置的任何条件(对我来说,用户选择dev、test、prod)。 - SpaceSteak
你是在使用这个应用程序来维护一组数据库/发布,这些数据库/发布由不同的客户端使用,所有客户端都运行相同的模式吗?我试图理解为什么你想要做你正在做的事情...主要是因为我很好奇 :) - Tr1stan
@SpaceSteak 好思路 - 我会试着探索一下。 - heymega
@Tr1stan 我有一个现有的应用程序,它以层次结构运作。其中包括1个父级和3个子级。这3个子级具有相同的架构但不同的数据。 - heymega
1个回答

6

每个上下文实例都有一个数据库连接。

假设每个子数据库都将具有相同的代码优先模型,您可以为每个数据库启动同一上下文类的一个实例。

只需调用 DbContext.Initialize(true) 迁移数据库,然后关闭连接即可。

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;
    }
}

嗯,那可能行 - 你会建议在MVC应用程序中的哪里初始化这3个DbContext吗? - heymega
它可以在启动时进行初始化,或者当您的应用程序需要使用持久性时进行初始化。这些上下文由控制器使用,但上下文取决于模型,因此可能存在一个持久层在控制器层和模型层之间。 - Anthony Brenelière
抱歉回复晚了 - 我已经成功地让它工作了,所以感谢您的帮助。这里的诀窍是将 MigrateDatabaseToLatestVersion 的 useSuppliedContext 设置为 true,否则它将期望一个空构造函数。 - heymega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接