C# 实体框架代码首次自动迁移不适用于Oracle数据库
我对Oracle数据库有一些问题。当我使用Entity Framework 6运行Windows窗体应用程序以将所有与数据库相关的更改应用于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数据库版本:“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和多模式数据库的经验,但是已经提出了一些问题,这些问题可能会引导您朝着正确的方向发展,但再一次,这一问题似乎超出了这个问题的范围,因此国际海事组织认为,应该在另一个问题中遵循这一点,而这一问题应该结束:)同意。谢谢