gpt4 book ai didi

c# - 在 EntityFramework Code First Migrations 中覆盖 "dbo"架构名称

转载 作者:行者123 更新时间:2023-12-03 21:29:44 24 4
gpt4 key购买 nike

我正在尝试使用 EntityFramework Codefirst 和 Oracle 数据库创建一个与模式无关的模型,但 EF 将 dbo 作为模式作为迁移的默认值。
我在我的 DBContext 上覆盖了 OnModelCreating 方法来解决这个问题,而是在 connectionString 中使用用户

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema(string.Empty);
}

问题是 __MigrationHistory 忽略了这个默认模式,我在运行第一次迁移时收到这个错误:

ORA-01918: User 'dbo' does not exist



尝试使用 this msdn entry 自定义此表的架构。

自定义历史上下文:
public class CustomHistoryContext : HistoryContext
{
public CustomHistoryContext(DbConnection dbConnection, string defaultSchema)
: base(dbConnection, defaultSchema) {}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

modelBuilder.HasDefaultSchema(String.Empty);
}
}

和数据库配置:
public sealed class Configuration :
DbMigrationsConfiguration<Model.MyDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
(connection, defaultSchema) => new CustomHistoryContext(connection, defaultSchema));
}

protected override void Seed(Model.Model1 context)
{
}
}

并且在第一次迁移时工作正常。但是当我修改我的实体模型并尝试使用 add-migration 命令反射(reflect)此更改时,我收到以下错误:

Unable to generate an explicit migration because the following explicit migrations are pending: [201706281804589_initial, 201706281810218_pp2]. Apply the pending explicit migrations before attempting to generate a new explicit migration.



看起来 EF 丢失了,此时无法找到迁移历史记录。

当我在 SetHistoryContextFactory 中评论 Configuration 指令时,它适用于后续的 add-migration 命令,但是当我想从头开始运行所有迁移(如部署)时,此解决方法不够。

有谁知道我是否可以很好地完成这项工作,或者是否有更好的解决方法?

最佳答案

转到 Migrations -> Configuration.cs 和下面提到的代码。这个修复对我有用!

class Configuration : DbMigrationsConfiguration<CodeFirstOracleProject.Context>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
var historyContextFactory = GetHistoryContextFactory("Oracle.ManagedDataAccess.Client");
SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
(dbc, schema) => historyContextFactory.Invoke(dbc, "YourSchemaName"));
}
}

关于c# - 在 EntityFramework Code First Migrations 中覆盖 "dbo"架构名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44810552/

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