【问题标题】:Oracle.ManagedDataAccess.EntityFramework - ORA-01918: user 'dbo' does not existOracle.ManagedDataAccess.EntityFramework - ORA-01918: 用户 'dbo' 不存在
【发布时间】:2021-07-28 00:38:39
【问题描述】:

我正在尝试使用 Oracle.ManagedDataAccess 6.121.1.0 提供程序实施代码首次迁移,但完全没有成功。

当我收到 ORA 代码时,我假设连接已成功打开。但是迁移失败了,因为提供程序的行为可能是 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>

这里是 Stacktrace:

[OracleException (0x77e): ORA-01918: 用户 'dbo' 不存在]
OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone) +652 OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean bFirstIterationDone) +39
OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParam8 Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery() +678
System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.b__0(DbCommand t,DbCommandInterceptionContext1 c) +10
System.Data.Entity.Infrastructure.Interception.InternalDispatcher
1.Dispatch(TTarget 目标,Func3 operation, TInterceptionContext interceptionContext, Action3 正在执行,Action3 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 迁移语句,DbTransaction 事务,DbInterceptionContext 拦截上下文)+82
System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 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 migrationStatements, DbTransaction existingTransaction) +194
System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 migrationStatements) +7
System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable
1 操作,IEnumerable1 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 pendingMigrations,字符串 targetMigrationId,字符串 lastMigrationId)+404
System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) +447
System.Data.Entity.Migrations.c__DisplayClassc.b__b() +13
System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) +422
System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) +78
System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func3 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.InitializeDatabase(TContext context) +137

【问题讨论】:

  • 请纠正这个错误 -
  • 感谢@lewis,这真是个错误。我已经为我们更新了。

标签: oracle entity-framework code-first entity-framework-migrations odp.net


【解决方案1】:

我遇到了同样的问题,Thiago Lunardi 的回复解决了这个问题。谢谢你。我没有足够的声誉来投票赞成您的回复。在这里提一下,我将架构名称设置为大写后成功。

把它放在你的新 dbContext 类下的 Context 文件中,像这样:

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

【讨论】:

  • 投票作为避免投票我自己的答案。 :) tks Отгонтөгс Миймаа
  • 大写是关键。我有同样的问题。
  • 我在哪里插入这个?
  • @RageCompex 在您的 DbContext 定义中。 public class MainContext : DbContext, IDbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("VSN"); //... } }
  • 大写!我正在尝试使用 Entity Framework (EF) Code First 和 Oracle Data Provider for .NET (ODP.NET) 的新项目。我在.Net中有以下代码。用户“SA”需要大写。 { modelBuilder.HasDefaultSchema("SA"); }
【解决方案2】:

我解决了这个问题,只是在 modelBuilder 中设置了默认架构

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

    // ...
}

【讨论】:

  • 并尝试将架构大写(这是您的用户名);)
【解决方案3】:

设置默认架构对我不起作用。 我通过自定义迁移历史记录表来设置不同的架构找到了解决方案。

您可以在这里找到解决方案:LINK

【讨论】:

    【解决方案4】:

    如果缺少表的完全限定名称,也会出现用户 Dbo。这可能不会映射到数据库中的正确表。

    【讨论】:

      【解决方案5】:

      如果您使用自动迁移(就像我一样),请注意:modelBuilder.HasDefaultSchema 在您切换到显式迁移之前无济于事。

      来自Oracle Docs

      Code First 自动迁移仅限于使用 dbo 架构。由于此限制,建议使用基于代码的迁移,即通过 Add-Migration 命令添加显式迁移

      【讨论】:

      • 如何切换到显式迁移?!
      • @ascriven 即通过 Add-Migration 命令添加显式迁移。
      【解决方案6】:

      在 Code First 中,您可以使用 Table 的 DataAnnotations。

      [Table("Emplpoyee",Schema="YOUR SCHEMA NAME"]

      【讨论】:

        【解决方案7】:

        我遇到了同样的问题。我将我的架构名称放在 OnModelCreating() 方法中。

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

        但是,以大写形式设置架构名称对我不起作用。我在 Confifuration.cs 中添加了下面提到的代码,它起作用了!!

        转到迁移 -> Configuration.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"));
            }
        }
        

        【讨论】:

          【解决方案8】:

          在我的情况下,以大写形式编写模式名称是不够的,我不得不使用 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()));
              }
          

          删除迁移并重新生成它们解决了问题。

          【讨论】:

            猜你喜欢
            • 2014-12-22
            • 1970-01-01
            • 2012-11-29
            • 1970-01-01
            • 1970-01-01
            • 2011-09-27
            • 1970-01-01
            • 2015-06-30
            • 1970-01-01
            相关资源
            最近更新 更多