【问题标题】:EF Multiple databases with one contextEF 具有一个上下文的多个数据库
【发布时间】:2015-10-09 12:29:54
【问题描述】:

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

但是,我很难让它与自动迁移一起使用。问题是,自动迁移需要一个我无法提供的无参数构造函数,而 IDbContextFactory 只允许我返回一个连接字符串。

有没有办法让迁移脚本针对多个数据库运行,或者我需要创建 3 个单独的上下文?

【问题讨论】:

  • 为了清楚起见,您正在使用一个 EF 上下文连接到使用相同架构的数据库的 3 个不同实例,并且您希望上下文能够维护所有 3 个实例的升级路径?
  • 没错!当它尝试进行自动迁移时,似乎只允许我指定一个连接字符串。
  • 如果@Tr1stan 说的是正确的,那么我的处理方式是public CustomContext() : base(DbConnections.GetCurrentConnectionString) { } 这样做是你的上下文仍然有一个无参数的构造函数,但连接字符串将取决于之前设置的任何标准(对我来说,用户选择 dev、test、prod)
  • 您是否在单独的应用程序中使用它来维护一组由单独的客户端使用的数据库/版本,它们都运行相同的架构?试图让我明白为什么你想做你正在做的事情……主要是因为我很爱管闲事:)
  • @SpaceSteak 好主意 - 我会尝试探索这个。

标签: c# entity-framework


【解决方案1】:

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

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

只需调用 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 个 dbcontexts?
  • 它可以在启动时或您的应用程序需要使用持久性时进行初始化。这些上下文由控制器使用,但上下文取决于模型,因此它可能是控制器层和模型层之间的持久层。
  • 对迟到的回复表示歉意 - 我确实设法让它工作,所以谢谢你的帮助。这里的技巧是将 MigrateDatabaseToLatestVersion useSuppliedContext 设置为 true ,否则它将期望一个空的构造函数。
猜你喜欢
  • 2012-05-05
  • 2015-04-21
  • 1970-01-01
  • 2014-09-14
  • 2012-02-25
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多