我尝试使用Oracle.ManagedDataAccess www.example.com提供程序实现代码优先迁移6.121.1.0,但完全没有成功。
当我收到一个ORA-code时,我假设连接已成功打开。但是迁移失败,可能是因为提供程序的行为方式是SQL Server,而不是Oracle。我认为这是因为它试图使用'dbo'作为默认架构。
下面是我的web.config设置:
<configuration>
<configSections>
<section name="entityFramework"
type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
requirePermission="false" />
<section name="Oracle.ManagedDataAccess.Client"
type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>
<entityFramework>
<contexts>
<context type="MyProject.Context.MainContext, MyProject.Context">
<databaseInitializer type="MyProject.Context.Config.ContextInitializer, MyProject.Context" />
</context>
</contexts>
<defaultConnectionFactory type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess" />
<providers>
<provider invariantName="Oracle.ManagedDataAccess.Client"
type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.ManagedDataAccess.Client" />
<add name="ODP.NET, Managed Driver"
invariant="Oracle.ManagedDataAccess.Client"
description="Oracle Data Provider for .NET, Managed Driver"
type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="MainContext"
providerName="Oracle.ManagedDataAccess.Client"
connectionString="Data Source=OracleServer:1521/BRSYSDS;User ID=USER;Password=PASSWORD;" />
</connectionStrings>
<!-- other settings -->
</configuration>
这里是堆栈跟踪:
[Oracle异常错误(0x 77 e):ORA-01918:用户'dbo'不存在]
(数据库中有更多行,布尔值b第一次迭代完成)+39
(字符串命令文本,Oracle参数集合参数Coll,命令类型命令类型,Oracle连接实现连接实现,Int 32 longFetchSize,Int 64客户端初始LOBFS,Oracle依赖关系实现或clDependencyImpl,Int 64 []& scnFromExecution,Oracle参数集合&绑定按位置参数Coll,布尔值& bBindParamPresent,Oracle异常& exceptionForArrayBindDML,布尔值isFromEF)+7480
数据库管理系统.数据库管理系统.客户端.数据库命令.执行非查询+678
系统.数据.实体.基础设施.拦截.数据库命令调度器.b__0(数据库命令t,数据库命令拦截上下文1 c) +10 System.Data.Entity.Infrastructure.Interception.InternalDispatcher
1.调度(T目标目标,功能3 operation, TInterceptionContext interceptionContext, Action
3执行,操作3 executed) +72 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) +357 System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() +104 System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext) +152 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable
1迁移语句,数据库事务事务,数据库拦截上下文拦截上下文)+82
系统.数据.实体.迁移.数据库迁移器.执行语句内部(IEnumerable 1 migrationStatements, DbConnection connection) +626 System.Data.Entity.Migrations.<>c__DisplayClass30.<ExecuteStatements>b__2e() +19 System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute(Action operation) +9 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable
1迁移语句,数据库事务现有事务)+194
系统.数据.实体.迁移.数据库迁移器.执行语句(I可枚举1 migrationStatements) +7 System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable
1个操作,I可枚举1 systemOperations, Boolean downgrading, Boolean auto) +825 System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading) +564 System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable
1个挂起迁移,字符串目标迁移ID,字符串最后迁移ID)+404
系统.数据.实体.迁移.数据库迁移器.更新内部(字符串目标迁移)+447
系统.数据.实体.迁移. c__显示类c.B__b()+13
系统.数据.实体.迁移.数据库迁移器.确保数据库存在(操作必须成功才能保留数据库)+422
系统.数据.实体.迁移.数据库迁移器.更新(字符串目标迁移)+78
系统.数据.实体.内部.数据库创建者.创建数据库(内部上下文内部上下文,功能3 createMigrator, ObjectContext objectContext) +89 System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext, DatabaseExistenceState existenceState) +116 System.Data.Entity.Database.Create(DatabaseExistenceState existenceState) +218 System.Data.Entity.DropCreateDatabaseAlways
1.初始化数据库(TContext上下文)+137
9条答案
按热度按时间knpiaxh11#
我遇到了同样的问题,Thiago Lunardi的回答解决了这个问题。谢谢。我没有足够的声誉来支持你的回答。在这里要提到的是,我在将模式名称设置为大写后成功了。
将其放在新dbContext类下的Context文件中,如下所示:
wecizke32#
我通过在modelBuilder中设置默认模式来解决这个问题
62o28rlo3#
设置默认架构对我不起作用。我通过自定义迁移历史记录表来设置不同的架构,找到了解决方案。
您可以在此处找到解决方案:LINK。
uqzxnwby4#
如果缺少表的完全限定名,也可以使用用户Dbo。它可能不会Map到数据库中的正确表。
ozxc1zmp5#
如果您使用自动迁移(像我一样),请注意:
modelBuilder.HasDefaultSchema
在您切换到显式迁移之前不会有任何帮助。从Oracle文件:
代码优先自动迁移仅限于使用dbo架构。由于此限制,建议使用基于代码的迁移,即通过Add-Migration命令添加显式迁移
lmyy7pcs6#
在Code First中,您可以使用数据表的DataAnnotations。
[数据表(“员工”,结构描述=“您的结构描述名称”]
bkhjykvo7#
我也遇到了同样的问题,我把我的模式名称放在OnModelCreating()方法中。
但是,设置模式名称在大写不为我工作。我添加了下面提到的代码在Confuration.cs和它的工作!
转到迁移-〉配置. cs
7xllpg7q8#
在我的例子中,用大写写模式名称是不够的,我不得不这样使用
toUpper()
函数:旁加
已删除迁移并重新生成它们,从而修复了该问题。
1wnzp6jl9#
作为一个初学者,我在这里的答案中遇到的主要问题是,用户“dbo”与模式名称有什么关系。
经过研究,以下是我的发现。
在Oracle中,纲要是数据库对象的集合。纲要由数据库使用者拥有,且与使用者同名。
但是,实体框架的默认架构是dbo,您可以按照下面列出的代码重写此架构:
对于Oracle,**“YOURSCHEMA”**必须是您所连接到的数据库的 user_id。
然后,您需要将以下内容添加到配置文件中
最后,删除生成的迁移文件,并再次重新运行Add-Migration。
我希望这能对某些人有所帮助。