oracle entity-framework code-first code-first-migrations odp.net

Oracle.ManagedDataAccess.EntityFramework-ORA-01918: el usuario ''dbo'' no existe



entity-framework code-first (6)

Estoy intentando implementar código First Migrations con el proveedor Oracle.ManagedDataAccess 6.121.1.0, pero sin éxito.

Como estoy recibiendo un código ORA, supongo que la conexión se ha abierto con éxito. Pero las migraciones están fallando porque, tal vez, el proveedor se está comportando como un servidor SQL, en lugar de Oracle. Creo que porque está trabajando para usar ''dbo'' como esquema predeterminado.

Aquí está mi configuración de 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>

Aquí el Stacktrace:

[OracleException (0x77e): ORA-01918: el usuario ''dbo'' no existe]
OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution (OracleConnectionImpl connectionImpl, Int32 y cursorId, bThrowArrayBindRelatedErrors booleanas, OracleException y exceptionForArrayBindDML, Boolean y hasMoreRowsInDB, Boolean bFirstIterationDone) 652 OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution (OracleConnectionImpl connectionImpl, Int32 y cursorId, bThrowArrayBindRelatedErrors booleanas, OracleException y exceptionForArrayBindDML, Boolean bFirstIterationDone ) +39
OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery (String CommandText, OracleParameterCollection paramColl, CommandType CommandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64 [] y scnFromExecution, OracleParameterCollection y bindByPositionParamColl, Boolean y bBindParamPresent, OracleException y exceptionForArrayBindDML, Boolean isFromEF) 7480
Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery () +678
System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.b__0 (DbCommand t, DbCommandInterceptionContext 1 c) +10
System.Data.Entity.Infrastructure.Interception.InternalDispatcher
1 c) +10
System.Data.Entity.Infrastructure.Interception.InternalDispatcher
1 c) +10
System.Data.Entity.Infrastructure.Interception.InternalDispatcher
1.Dispatch (TTarget target, Func 3 operation, TInterceptionContext interceptionContext, Action 3 ejecutándose, Action 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
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
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 transaction, DbInterceptionContext interceptionContext) +82
System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal (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 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, 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 (IEnumerable 1 migrationStatements) +7
System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable
1 migrationStatements) +7
System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable
1 migrationStatements) +7
System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable
1 operations, IEnumerable 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 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 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, String targetMigrationId, String 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, Func 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
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
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.InitializeDatabase (contexto TContext) +137


El usuario Dbo también viene en caso de que falte el nombre completo de la Tabla. Que no se puede asignar a la tabla correcta en la base de datos.


Establecer el esquema predeterminado no funcionó para mí. Encontré la solución al personalizar la tabla del historial de migraciones para establecer un esquema diferente.

Puedes encontrar una solución aquí: LINK .


Resuelvo esto simplemente estableciendo el esquema predeterminado en modelBuilder

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


Si usa Migraciones automáticas (como yo), entonces tenga en cuenta: modelBuilder.HasDefaultSchema sería de ayuda hasta que cambie a migraciones explícitas.

De Oracle Docs :

Primero migraciones automáticas de código se limita a trabajar con el esquema dbo solamente. Debido a esta limitación, se recomienda utilizar migraciones basadas en código, es decir, agregar migraciones explícitas mediante el comando Agregar migración.

Tuve el mismo problema y fue resuelto por la respuesta de Thiago Lunardi. Gracias. No tenía suficiente reputación para votar su respuesta. Para mencionarlo aquí, lo logré después de configurar mi nombre de esquema en MAYÚSCULAS.

Pon esto en tu archivo de contexto debajo de tu nueva clase dbContext, así:

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


en Code First puede usar las anotaciones de datos para Table.

[Tabla ("Emplpoyee", Schema = "SU NOMBRE ESQUEMA"]