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
1.Dispatch(TTarget target、Func
System.Data.Entity.Infrastructure.Interception.InternalDispatcher3 operation, TInterceptionContext interceptionContext, Action
3実行中、アクション3 executed) +72
1 migrationStatements、DbTransactionトランザクション、DbInterceptionContext interceptionContext)+82
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
System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 migrationStatements, DbConnection connection) +626
1 migrationStatements、DbTransaction existingTransaction)+194
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
System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 migrationStatements) +7
1オペレーション、IEnumerable
System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable1 systemOperations, Boolean downgrading, Boolean auto) +825
1 pendingMigrations、文字列targetMigrationId、文字列lastMigrationId)+404
System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading) +564
System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable
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
1.InitializeDatabase(TContext context)+137
System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext, DatabaseExistenceState existenceState) +116
System.Data.Entity.Database.Create(DatabaseExistenceState existenceState) +218
System.Data.Entity.DropCreateDatabaseAlways
私も同じ問題を抱えていましたが、チアゴ・ルナルディの対応で解決しました。ありがとうございました。私はあなたの回答に投票するほどの評判がありませんでした。ここで言及するために、私は大文字でスキーマ名を設定した後に成功しました。
これを、次のように、新しい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");
// ...
}
デフォルトのスキーマを設定してもうまくいきませんでした。移行履歴テーブルをカスタマイズして別のスキーマを設定することで解決策を見つけました。
ここで解決策を見つけることができます: [〜#〜] link [〜#〜] 。
ユーザーDboは、テーブルの完全修飾名が欠落している場合にも表示されます。データベースの正しいテーブルにマップされない可能性があります。
コードファーストでは、DataAnnotations for Tableを使用できます。
[Table( "Employee"、Schema = "YOU'RE SCHEMA NAME"]
(私のように)自動移行を使用する場合は、次のことに注意してください:modelBuilder.HasDefaultSchema
明示的な移行に切り替えるまで、役に立ちませんでした。
From Oracle Docs :
コードファースト自動移行は、 dbo スキーマのみ。この制限のため、コードベースの移行を使用することをお勧めします。つまり、Add-Migrationコマンドを使用して明示的な移行を追加します