Oracle.管理数据访问.实体框架- ORA-01918:使用者'dbo'不存在

c9x0cxw0  于 2022-11-03  发布在  Oracle
关注(0)|答案(9)|浏览(391)

我尝试使用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

knpiaxh1

knpiaxh11#

我遇到了同样的问题,Thiago Lunardi的回答解决了这个问题。谢谢。我没有足够的声誉来支持你的回答。在这里要提到的是,我在将模式名称设置为大写后成功了。
将其放在新dbContext类下的Context文件中,如下所示:

public partial class MyAppContext : DbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema("UPPERCASE_SCHEMA_NAME");
...
wecizke3

wecizke32#

我通过在modelBuilder中设置默认模式来解决这个问题

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema("MyOracleSchema");

    // ...
}
62o28rlo

62o28rlo3#

设置默认架构对我不起作用。我通过自定义迁移历史记录表来设置不同的架构,找到了解决方案。
您可以在此处找到解决方案:LINK

uqzxnwby

uqzxnwby4#

如果缺少表的完全限定名,也可以使用用户Dbo。它可能不会Map到数据库中的正确表。

ozxc1zmp

ozxc1zmp5#

如果您使用自动迁移(像我一样),请注意:modelBuilder.HasDefaultSchema在您切换到显式迁移之前不会有任何帮助。
从Oracle文件:
代码优先自动迁移仅限于使用dbo架构。由于此限制,建议使用基于代码的迁移,即通过Add-Migration命令添加显式迁移

lmyy7pcs

lmyy7pcs6#

在Code First中,您可以使用数据表的DataAnnotations。

[数据表(“员工”,结构描述=“您的结构描述名称”]

bkhjykvo

bkhjykvo7#

我也遇到了同样的问题,我把我的模式名称放在OnModelCreating()方法中。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema("MyOracleSchema");

    // ...
}

但是,设置模式名称在大写不为我工作。我添加了下面提到的代码在Confuration.cs和它的工作!
转到迁移-〉配置. cs

class Configuration : DbMigrationsConfiguration<CodeFirstOracleProject.Context>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        var historyContextFactory = GetHistoryContextFactory("Oracle.ManagedDataAccess.Client");
        SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
                                 (dbc, schema) => historyContextFactory.Invoke(dbc, "YourSchemaName"));
    }
}
7xllpg7q

7xllpg7q8#

在我的例子中,用大写写模式名称是不够的,我不得不这样使用toUpper()函数:

modelBuilder.HasDefaultSchema("YOURSCHEMA".ToUpper())

旁加

public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        var historyContextFactory = GetHistoryContextFactory("Oracle.ManagedDataAccess.Client");
        SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
                                 (dbc, schema) => historyContextFactory.Invoke(dbc, "YOURSCHEMA".ToUpper()));
    }

已删除迁移并重新生成它们,从而修复了该问题。

1wnzp6jl

1wnzp6jl9#

作为一个初学者,我在这里的答案中遇到的主要问题是,用户“dbo”与模式名称有什么关系。
经过研究,以下是我的发现。

在Oracle中,纲要是数据库对象的集合。纲要由数据库使用者拥有,且与使用者同名。
但是,实体框架的默认架构是dbo,您可以按照下面列出的代码重写此架构:

modelBuilder.HasDefaultSchema("YOURSCHEMA".ToUpper())

对于Oracle,**“YOURSCHEMA”**必须是您所连接到的数据库的 user_id
然后,您需要将以下内容添加到配置文件中

public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        var historyContextFactory = GetHistoryContextFactory("Oracle.ManagedDataAccess.Client");
        SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
                                 (dbc, schema) => historyContextFactory.Invoke(dbc, "YOURSCHEMA".ToUpper()));
    }

最后,删除生成的迁移文件,并再次重新运行Add-Migration
我希望这能对某些人有所帮助。

相关问题