gpt4 book ai didi

c# - 独立于架构的 Entity Framework 代码优先迁移

转载 作者:可可西里 更新时间:2023-11-01 07:59:01 24 4
gpt4 key购买 nike

我在使用针对 Oracle 数据库的 Entity Framework 迁移时遇到了麻烦,因为架构名称包含在迁移代码中,对于 Oracle,架构名称也是用户名。我的目标是拥有模式独立的代码优先迁移(能够拥有一组用于测试和生产环境的迁移)。

我已经尝试过这种方法(使用 Entity Framework 6.1.3):

1) 我在 Web.config 中有架构名称:

<add key="SchemaName" value="IPR_TEST" />

2) 我的 DbContext 将架构名称作为构造函数参数:

public EdistributionDbContext(string schemaName) 
: base("EdistributionConnection")
{
_schemaName = schemaName;
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema(_schemaName);
}

3) 我必须为 Entity Framework 迁移实现 IDbContextFactory 才能创建没有无参数构造函数的 DbContext:

public class MigrationsContextFactory : IDbContextFactory<EdistributionDbContext>
{
public EdistributionDbContext Create()
{
return new EdistributionDbContext(GetSchemaName());
}
}

4) 我还配置了迁移历史表以放置在正确的模式中:

public class EdistributionDbConfiguration : DbConfiguration
{
public EdistributionDbConfiguration()
{
SetDefaultHistoryContext((connection, defaultSchema)
=> new HistoryContext(connection, GetSchemaName()));
}
}

5) 我修改了为迁移生成的代码以替换硬编码的架构名称。例如。我替换了 CreateTable("IPR_TEST.Users")CreateTable($"{_schema}.Users") . (_schema 字段根据 Web.config 中的值设置)。

6) 我使用 MigrateDatabaseToLatestVersion<EdistributionDbContext, MigrationsConfiguration>()数据库初始化程序。

完成所有这些设置后,当我切换到不同的模式(例如通过 web.config 转换)时我仍然遇到问题 - 抛出异常告诉我数据库与我的模型不匹配并且 AutomaticMigrations 被禁用(这是期望的) ).当我尝试执行 add-migration生成一个新的迁移,其中所有对象都应该移动到不同的模式(例如:MoveTable(name: "IPR_TEST.DistSetGroups", newSchema: "IPR");,这绝对是不希望的。

对我来说,模式名称似乎是迁移类中模型字符串哈希中某处的硬连线(例如 201509080802305_InitialCreate.resx),即:

<data name="Target" xml:space="preserve">
<value>H4sIAAAAAAAEAO09227jO... </value>
</data>

有没有办法告诉 Code First Migrations 忽略架构名称?

最佳答案

您可以在 OnModelCreating 中创建派生的 DbContext 和“覆盖”modelBuilder.HasDefaultSchema(...):

public class TestDbContext : ProductionDbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

modelBuilder.HasDefaultSchema("TestSchema");
}
}

然后您可以为两个上下文创建迁移。参见 this question关于如何在一个项目中创建两个迁移。

这种方法的缺点是您必须维护两个单独的迁移。但它使您有机会调整 TestDbContext 的配置。

关于c# - 独立于架构的 Entity Framework 代码优先迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32457006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com