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
1.Dispatch (cible TTarget, Func
System.Data.Entity.Infrastructure.Interception.InternalDispatcher3 operation, TInterceptionContext interceptionContext, Action
3 exécution, Action3 executed) +72
1 migrationStatements, transaction 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 opérations, IEnumerable
System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable1 systemOperations, Boolean downgrading, Boolean auto) +825
1 pendingMigrations, String targetMigrationId, String 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 (contexte TContext) +137
System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext, DatabaseExistenceState existenceState) +116
System.Data.Entity.Database.Create(DatabaseExistenceState existenceState) +218
System.Data.Entity.DropCreateDatabaseAlways
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");
// ...
}
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 .
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.
dans Code First, vous pouvez utiliser les DataAnnotations pour Table.
[Table ("Employé", Schéma = "VOUS ÊTES NOM DU SCHÉMA"])
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