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

标签 c# oracle entity-framework entity-framework-migrations

我在使用针对 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/

相关文章:

c# - 在 EntityFramework 中执行 Oracle 存储过程

C# 接口(interface)继承(基础)

oracle - 在 oracle pl/sql 中将游标从内部过程返回到外部过程

c# - 操作无法完成,因为已使用 MVC 4 处理 DbContext

c# - 不声明外键的导航属性

c# - 绑定(bind)到显式接口(interface)实现的 SortDescription

c# - Repeater 的存储过程 - 从表中选择列

创建自动编号的 Oracle 触发器

sql - 按照显示模式将缺失的行(具有零值)插入表中

entity-framework - 在没有竞争条件的情况下使用 Entity Framework 实现 if-not-exists-insert