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