C# 实体框架代码首次自动迁移不适用于Oracle数据库

C# 实体框架代码首次自动迁移不适用于Oracle数据库,c#,oracle,entity-framework,ef-code-first,C#,Oracle,Entity Framework,Ef Code First,我对Oracle数据库有一些问题。当我使用Entity Framework 6运行Windows窗体应用程序以将所有与数据库相关的更改应用于Oracle数据库时,出现以下错误: 不支持影响迁移历史记录系统表位置的自动迁移(例如默认架构更改)。 请对影响迁移历史记录系统表位置的操作使用基于代码的迁移 Oracle数据库版本:“Oracle数据库18c快速版发行版18.0.0.0-生产版18.4.0.0.0” 我使用的是启用自动迁移的代码优先方法。当我连接到SQL Server数据库时(注意:SQL

我对Oracle数据库有一些问题。当我使用Entity Framework 6运行Windows窗体应用程序以将所有与数据库相关的更改应用于Oracle数据库时,出现以下错误:

不支持影响迁移历史记录系统表位置的自动迁移(例如默认架构更改)。
请对影响迁移历史记录系统表位置的操作使用基于代码的迁移

Oracle数据库版本:“Oracle数据库18c快速版发行版
18.0.0.0
-生产版
18.4.0.0.0

我使用的是启用自动迁移的代码优先方法。当我连接到SQL Server数据库时(注意:SQL Server数据库连接仅用于交叉检查),这种代码优先的方法工作得很好,但Oracle存在此问题

我从我身边尝试的

我添加了基于代码的迁移脚本,即
addmigration 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);
                }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
HasDefaultSchema(“PDBADMIN”);
modelBuilder.Entity()
.Property(e=>e.sortrev)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.fldtype)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.fldstr1)
.IsUnicode(假);
}
任何帮助都将不胜感激


谢谢

在这一行
modelBuilder.hasdaultschema(“PDBADMIN”)中,您正在将模式更改为
PDBADMIN
。不幸的是,您不能使用自定义架构名称对Oracle提供程序进行自动迁移

代码优先自动迁移仅限于使用dbo模式。由于此限制,建议使用 基于代码的迁移,即通过 添加迁移命令

因此,您必须使用默认的模式名
dbo
,或者禁用自动迁移并使用基于代码的迁移

在我个人看来,即使您没有遇到Oracle提供商的这个特殊问题,我还是强烈建议您使用基于代码的迁移

在团队中工作时,这也是最重要的:

您可以在自动迁移和基于代码的迁移之间穿插,但这是非常困难的 不建议在团队开发场景中使用。如果你是 使用源代码管理的开发团队 纯自动迁移或纯基于代码的迁移考虑到 自动迁移的局限性我们建议使用基于代码的 团队环境中的迁移。


你能在DbContext中发布你的
OnModelCreating
的代码吗?@dglozano检查我发布的问题。我添加了示例代码供您参考。我的回答是否澄清了您的问题:)?@dglozano是的,但我正在寻找其他好的解决方案来解决此问题。有点独立于模式。我认为您不会找到使用自定义模式名称、oracle数据库提供程序和自动迁移的替代解决方案,只是不支持。您可以使用默认架构名称,也可以关闭自动迁移或更改提供程序。在这种情况下,最佳可行的“替代和良好解决方案”是关闭自动迁移。我同意基于代码的迁移,将自动迁移设置为false。但在我的例子中,我在运行时添加了多个Oracle数据库,因此当我添加具有特定模式(即PDBADMIN)的迁移时,以及当我使用相同的数据库运行时,它将工作。但我要添加新的数据库并运行,然后它会给我错误。因为它正在考虑迁移到PDBADMIN的历史记录。但是它应该考虑我们的新数据库模式。因此,我们希望通过C#代码将自定义模式设置为所有已添加的迁移脚本。@VipulOdhavani我不完全理解您的场景,并且我没有使用EF Core和多模式数据库的经验,但是已经提出了一些问题,这些问题可能会引导您朝着正确的方向发展,但再一次,这一问题似乎超出了这个问题的范围,因此国际海事组织认为,应该在另一个问题中遵循这一点,而这一问题应该结束:)同意。谢谢