实体框架代码第一次自动迁移不适用于 Oracle 数据库
Posted
技术标签:
【中文标题】实体框架代码第一次自动迁移不适用于 Oracle 数据库【英文标题】:Entity Framework code first auto migration not working with Oracle database 【发布时间】:2021-06-20 18:16:16 【问题描述】:我在使用 Oracle 数据库时遇到了一些问题。当我使用 Entity Framework 6 运行我的 Windows 窗体应用程序以将所有与数据库相关的更改应用到 Oracle 数据库时,我收到此错误:
不支持影响迁移历史系统表位置的自动迁移(例如默认架构更改)。 对于影响迁移历史系统表位置的操作,请使用基于代码的迁移。
Oracle 数据库版本:“Oracle Database 18c Express Edition Release 18.0.0.0.0
- Production Version 18.4.0.0.0
”
我正在使用启用自动迁移的代码优先方法。当我连接到 SQL Server 数据库时,此代码优先方法可以完美运行(注意:SQL Server 数据库连接仅用于交叉检查)但 Oracle 存在此问题。
我的尝试
我添加了基于代码的迁移脚本,即Add-Migration CreateNewDB
,然后将此迁移应用到 Oracle 数据库并且它可以工作。
但我想自动更新数据库并将任何更改应用于仍然无法自动工作的 Oracle 数据库(自动迁移)。目前我需要创建一个基于代码的迁移,并且每次都将其应用到 Oracle 数据库中。
模型创建示例代码
protected override void OnModelCreating(DbModelBuilder modelBuilder)
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema("PDBADMIN");
modelBuilder.Entity<ADHOCCHECK>()
.Property(e => e.sortrev)
.IsUnicode(false);
modelBuilder.Entity<ADHOCCONSTRAINT>()
.Property(e => e.fldtype)
.IsUnicode(false);
modelBuilder.Entity<ADHOCCONSTRAINT>()
.Property(e => e.fldstr1)
.IsUnicode(false);
任何帮助将不胜感激。
谢谢!
【问题讨论】:
你能把OnModelCreating
的代码贴在DbContext中吗?
@dglozano 检查我发布的问题。我添加了示例代码供您参考。
我的回答是否澄清了您的问题:)?
@dglozano 是的,但我正在寻找一些替代的和好的解决方案来解决这个问题。独立于模式的种类。
我认为您不会找到使用自定义模式名称、oracle 数据库提供程序和自动迁移的替代解决方案,它只是不受支持。您要么使用默认模式名称,要么关闭自动迁移或更改提供程序。在这种情况下,最好的可行“替代和良好解决方案”是关闭自动迁移。
【参考方案1】:
在modelBuilder.HasDefaultSchema("PDBADMIN");
这一行中,您将架构更改为PDBADMIN
。不幸的是,您不能通过使用自定义模式名称的 Oracle 提供程序使用自动迁移。
来自Oracle's documentation
Code First 自动迁移仅限于使用 dbo 架构。由于此限制,建议使用 基于代码的迁移,即通过 添加迁移命令。
因此,您必须要么使用默认架构名称 dbo
,要么禁用自动迁移并使用基于代码的迁移。
在我个人看来,即使您没有遇到 Oracle 提供商的这个特殊问题,我还是强烈建议您使用基于代码的迁移。
在团队工作时也是official recommendation:
您可以穿插自动和基于代码的迁移,但这是 不建议在团队开发场景中使用。如果你是一个 使用源代码控制的开发人员团队,您应该使用 纯自动迁移或纯基于代码的迁移。 鉴于 我们建议使用基于代码的自动迁移的限制 团队环境中的迁移。
【讨论】:
我同意将自动迁移设置为 false 的基于代码的迁移。但在我的情况下,我添加了多个 Oracle 数据库运行时,所以当我添加具有特定模式的迁移时,即 PDBADMIN 并且当我使用相同的数据库运行时,它将起作用。但我要添加新数据库并运行它然后它给了我错误。因为它正在考虑迁移到 PDBADMIN 的历史记录。但它应该考虑我们的新数据库模式。所以我们想通过 C# 代码将自定义模式设置为所有已添加的迁移脚本。 @VipulOdhavani 我不完全了解您的情况,也没有使用 EF Core 和多模式数据库的经验,但是已经有几个问题可以指导您正确的方向***.com/questions/46205602/… 但是再一次,这个问题似乎超出了这个问题的范围,所以 IMO 应该在另一个问题中遵循这个问题并且这个问题被关闭:) 同意。谢谢!以上是关于实体框架代码第一次自动迁移不适用于 Oracle 数据库的主要内容,如果未能解决你的问题,请参考以下文章