J'utilise .NET4.5.1
, MVC5
, EF6
, avec Oracle.ManagedDataAccess 4.121.1.0
et Oracle.ManagedDataAccess.EntityFramework 6.121.2.0
J'ai été en mesure de générer un modèle à partir d'une base de données existante (une partie de celle-ci ajoutant une table à la fois), la construction de l'application est parfaite.
Cependant, lorsque j'essaie d'exécuter une requête test pour voir si elle peut obtenir les données
public ActionResult Cancellations()
{
var factoryClasses = System.Data.Common.DbProviderFactories.GetFactoryClasses();
using (var db = new Entities())
{
var cancelationStatuses = new[] {3, 7, 9};
var result = db.TRANSACTIONDETAIL.Where(o => cancelationStatuses.Contains(o.TRANSACTIONSTATUSID));
return View(result);
}
}
il échoue (sur var result = ...
) avec Unable to find the requested .Net Framework Data Provider. It may not be installed.
_ { En essayant de chercher } _ DbProviderFactories
en effet il n'y a rien dans la collection (var factoryClasses =
).
Cependant j'ai installé 12c 4 (ODTwithODAC121024) } et 11g (ODTwithODAC1120320_32bit), et ai redémarré l'ordinateur.
La base de données fonctionne sur 11g et je peux y accéder avec PL/SQL developer
Web.config ressemble à:
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
<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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>
.....
<connectionStrings>
.....
<add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=Oracle_user;Password=Oracle_user_password;Data Source=Oracle" />
<add name="Entities" connectionString="metadata=res://*/OracleDb.csdl|res://*/OracleDb.ssdl|res://*/OracleDb.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string='data source=******" providerName="System.Data.EntityClient" /> </connectionStrings>
......
<system.data>
<DbProviderFactories>
<!-- Remove in case this is already defined in machine.config -->
<add name="Oracle Data Provider for .NET" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
Mon hypothèse est un échec, car Oracle n’est pas enregistré dans DbProviderFactories
ou ailleurs
Comment enregistrer Oracle dans DbProviderFactories? Ou si ce n'est pas le cas, qu'est-ce qui ne va pas avec ma configuration?
Deviner.
Dans mon machine.config
il y avait déjà
<add name="Oracle Data Provider for .NET" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
et puis cela a été répété dans mon web.config
, ce qui empêcherait silencieusement de donner des fournisseurs. Donc après avoir sorti:
<add name="Oracle Data Provider for .NET" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
Je l'ai fait courir.
J'ai rencontré cette erreur lorsque j'ai mis à jour Visual Studio 2017 . L'erreur peut être résolue en réinstallant ODT pour VS 2017:
1) Fermez Visual Studio.
2) Désinstallez les outils de développement Oracle existants pour Visual Studio 2017 à partir du Panneau de configuration.
3) Installez le dernier (ODTforVS2017_122011.exe) à partir du lien suivant:
http://www.Oracle.com/technetwork/topics/dotnet/downloads/odacmsidownloadvs2017-3806459.html
4) Ouvrez Visual Studio et créez la solution. L’erreur ne devrait pas être générée maintenant.
J'ai résolu ce problème en ajoutant ODP.NET (Oracle.ManagedDataAccess.EntityFramework 12c) de NuGet. J'utilise VS2015 avec EF 6.2.0.
Je viens de résoudre cette erreur en installant l'outil Oracle Developer Tool pour Visual Studio 2013 (ma version VS installée) ODTforVS2013_121025.exe