【问题标题】:EF CORE: is it possible to support two models in one database?EF CORE:是否可以在一个数据库中支持两种模型?
【发布时间】:2018-11-08 23:35:59
【问题描述】:

是否可以在一个数据库中支持两种不同的具有所有“迁移功能”的 EF Core 模型?

我想我应该以某种方式将 dbo._EFMigrationsHistory 分开? 在文档中找不到这样的选项。

【问题讨论】:

  • 我没有详细的例子,但一个例子是IdentityServer.Samples repo(CombinedAspIdentity 项目)。该项目使用三个上下文,包含三组迁移。可以为每个上下文指定迁移(来自 cli,而不是 pmc):dotnet ef migrations add InitialIdentityServerConfigurationDbMigration --context ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb
  • 谢谢。乍一看..我不明白它是如何工作的。为什么客户端配置文件不包含连接字符串?也许你知道在哪里可以找到它们?从他们那里应该清楚他们使用了多少个db(因为只有一个和相同的并不明显)。
  • 只有一个连接字符串(同一个数据库中的三个上下文)。连接字符串在 AppSettings.json
  • @K_foxer9 :这是 appsetting.json :github.com/IdentityServer/IdentityServer4.Samples/blob/release/… 。没有连接字符串

标签: entity-framework entity-framework-core entity-framework-migrations entity-framework-core-2.1


【解决方案1】:

是的,您可以在同一个数据库中拥有多个上下文。 I've put together a sample showing three contexts in the same database。您像往常一样声明三个上下文,并且在设置迁移时会表现出差异;您只需要在此处更明确地命名您正在迁移或更新的上下文,并且明确说明迁移的去向是一个好主意。

这是上面链接的示例项目的 Program.Main,显示了三个基本添加的依赖注入上下文,然后对每个上下文进行“填充”。其余文件请参见 Github 上的 repo。

    class Program
{
    static async Task Main(string[] args)
    {
        var providers = new ServiceCollection()
            .AddDbContext<AnimalContext>(options => options.UseSqlServer(Globals.CONNECTIONSTRING))
            .AddDbContext<DoctorContext>(options => options.UseSqlServer(Globals.CONNECTIONSTRING))
            .AddDbContext<CarContext>(options => options.UseSqlServer(Globals.CONNECTIONSTRING))
            .BuildServiceProvider();

        var animalContext = providers.GetService<AnimalContext>();
        await AnimalHelpers.Seed(animalContext);
        await AnimalHelpers.Read(animalContext);

        var carContext = providers.GetService<CarContext>();
        await CarHelpers.Seed(carContext);
        await CarHelpers.Read(carContext);

        var doctorContext = providers.GetService<DoctorContext>();
        await DoctorHelpers.Seed(doctorContext);
        await DoctorHelpers.Read(doctorContext);

        Console.ReadKey();

    }
}

为了初始化数据库,我为每个上下文运行迁移,然后为每个上下文运行更新数据库,如下所示(在 powershell 中;PMC 命令/标志略有不同):

迁移:

dotnet ef migrations add CreateAnimalsSchema --context AnimalContext -o Data/Migrations/Animals

数据库更新:

dotnet ef database update --context AnimalContext

【讨论】:

  • 我会试试的。 “像往常一样做”。但我仍然不明白 dbo.__EFMigrationsHistory 会发生什么...如果仅包含 MigrationId 和版本号列,它如何注册多个cotnexts...
  • 修复了迁移命令中的错误“#”。关于 MigrationsHistory,一旦你初始化它们,只要你每次都指定上下文,新的迁移就会自动放置在正确的文件夹中。就数据库而言,我不明白为什么它会关心 EF 上下文;它只是通过 id 跟踪迁移,而 EF 核心跟踪哪个迁移与哪个上下文一起进行。对于示例项目,其 dbo__MigrationsHistory 包含三个条目:20180630184548_CreateDoctorSchema20180630184557_CreateAnimalsSchema20180630184610_CreateCarsSchema
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2021-09-16
相关资源
最近更新 更多