web-dev-qa-db-ja.com

Oracle.ManagedDataAccess.EntityFramework-ORA-01918:ユーザー 'dbo'が存在しません

Oracle.ManagedDataAccess 6.121.1.0プロバイダーを使用してコードFirst Migrationsを実装しようとしていますが、まったく成功しません。

ORA-codeを受け取っているので、接続が正常に開かれたと想定しています。しかし、おそらくプロバイダがOracleではなくSQL Serverとして動作しているため、移行は失敗しています。デフォルトのスキーマとして '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>

ここにスタックトレースがあります:

[OracleException(0x77e):ORA-01918:ユーザー 'dbo'が存在しません]
[.____。 OracleException&exceptionForArrayBindDML、ブール値bFirstIterationDone)+39
[.____。 isFromEF)+7480
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 target、Func3 operation, TInterceptionContext interceptionContext, Action3実行中、アクション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 migrationStatements、DbTransactionトランザクション、DbInterceptionContext interceptionContext)+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

21
Thiago Lunardi

私も同じ問題を抱えていましたが、チアゴ・ルナルディの対応で解決しました。ありがとうございました。私はあなたの回答に投票するほどの評判がありませんでした。ここで言及するために、私は大文字でスキーマ名を設定した後に成功しました。

これを、次のように、新しいdbContextクラスの下のContextファイルに配置します。

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

私はmodelBuilderでデフォルトのスキーマを設定するだけでこれを解決します

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

    // ...
}
16
Thiago Lunardi

デフォルトのスキーマを設定してもうまくいきませんでした。移行履歴テーブルをカスタマイズして別のスキーマを設定することで解決策を見つけました。

ここで解決策を見つけることができます: [〜#〜] link [〜#〜]

2
VeRo

ユーザーDboは、テーブルの完全修飾名が欠落している場合にも表示されます。データベースの正しいテーブルにマップされない可能性があります。

enter image description here

2
Aditya

コードファーストでは、DataAnnotations for Tableを使用できます。

[Table( "Employee"、Schema = "YOU'RE SCHEMA NAME"]

1
Faisal Saleem

(私のように)自動移行を使用する場合は、次のことに注意してください:modelBuilder.HasDefaultSchema明示的な移行に切り替えるまで、役に立ちませんでした。

From Oracle Docs

コードファースト自動移行は、 dbo スキーマのみ。この制限のため、コードベースの移行を使用することをお勧めします。つまり、Add-Migrationコマンドを使用して明示的な移行を追加します
1
Alexey Merson