web-dev-qa-db-fra.com

Oracle.ManagedDataAccess.EntityFramework - ORA-01918: l'utilisateur 'dbo' n'existe pas

J'essaie d'implémenter le code First Migrations avec le fournisseur Oracle.ManagedDataAccess 6.121.1.0, mais sans succès.

Comme je reçois un code ORA, je suppose que la connexion a été ouverte avec succès. Mais les migrations échouent car, peut-être, le fournisseur se comporte comme un serveur SQL, au lieu d'Oracle. Je pense que parce qu'il est tentant d'utiliser 'dbo' comme schéma par défaut.

Voici mes paramètres 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>

Voici le Stacktrace:

[OracleException (0x77e): ORA-01918: l'utilisateur "dbo" n'existe pas]
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 & bBindParamPresent, OracleException & exceptionForArrayBindDML, Boolean 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 (cible TTarget, Func3 operation, TInterceptionContext interceptionContext, Action3 exécution, 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 migrationStatements, transaction 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 opérations, 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, 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, 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 (contexte TContext) +137

21
Thiago Lunardi

J'ai eu le même problème et il a été résolu par la réponse de Thiago Lunardi. Je vous remercie. Je n'avais pas assez de réputation pour voter votre réponse. Pour mentionner ici, j'ai réussi après avoir défini mon nom de schéma en MAJUSCULE.

Mettez ceci dans votre fichier Context sous votre nouvelle classe dbContext, comme ceci:

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

Je résous cela en définissant simplement le schéma par défaut sur modelBuilder

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

    // ...
}
16
Thiago Lunardi

La définition du schéma par défaut n'a pas fonctionné pour moi. J'ai trouvé la solution en personnalisant la table d'historique des migrations pour définir un schéma différent.

Vous pouvez trouver une solution ici: LIEN .

2
VeRo

L'utilisateur Dbo vient également en cas de nom complet manquant de la table. Qui peut ne pas correspondre à la bonne table dans la base de données.

enter image description here

2
Aditya

dans Code First, vous pouvez utiliser les DataAnnotations pour Table.

[Table ("Employé", Schéma = "VOUS ÊTES NOM DU SCHÉMA"])

1
Faisal Saleem

Si vous utilisez les migrations automatiques (comme je l'étais), notez: modelBuilder.HasDefaultSchema ne vous aiderait pas tant que vous ne passez pas à des migrations explicites.

De Oracle Docs :

Code First Migrations automatiques se limite à travailler avec le dbo schéma uniquement. En raison de cette limitation, il est recommandé d'utiliser des migrations basées sur du code, c'est-à-dire d'ajouter des migrations explicites via la commande Add-Migration
1
Alexey Merson