实体框架代码第一次自动迁移不适用于 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 数据库的主要内容,如果未能解决你的问题,请参考以下文章

EF 自动迁移不适用于虚拟属性

独立于模式的实体框架代码优先迁移

Remove() 不适用于实体框架中的多对多关系

实体框架代码优先:启用迁移错误

实体框架代码迁移 - 卡在初始迁移上

实体框架适用于本地服务器但不适用于远程