IIS中带有EF6的ASP.NET Core MVC-找不到Oracle.DataAccess.Client

时间:2019-01-04 13:40:13

标签: oracle iis entity-framework-6 asp.net-core-mvc

对于此问题,已经有许多关于SO的问题。但是,我提供的所有答案都无济于事。 我们有一个针对net461的ASP.NET Core MVC项目,因此我们可以将Entity Framework 6用于Oracle数据库。

相关问题

我自己和所有其他开发人员都认为它可以在我们的PC上正常工作。但是,当部署到IIS服务器时,我得到以下信息:

Error ::Schema specified is not valid. Errors:
Oracle.ManagedDataAccess.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(2,64) : error 0175: The ADO.NET provider with invariant name 'Oracle.DataAccess.Client' is either not registered in the machine or application config file, or could not be loaded. See the inner exception for details.
Oracle.ManagedDataAccess.EntityFramework.Resources.EFOracleStoreSchemaDefinitionVersion3.ssdl(3,4) : error 0019: The EntityContainer name must be unique. An EntityContainer with the name 'Schema' is already defined.
Oracle.ManagedDataAccess.EntityFramework.Resources.EFOracleStoreSchemaDefinitionVersion3.ssdl(867,4) : error 0019: Each type name in a schema must be unique. Type name 'Oracle.Table' was already defined.
Oracle.ManagedDataAccess.EntityFramework.Resources.EFOracleStoreSchemaDefinitionVersion3.ssdl(877,4) : error 0019: Each type name in a schema must be unique. Type name 'Oracle.TableColumn' was already defined.
... and so on.

尽管我已经看到发布Oracle.ManagedDataAccess.dll是连接到Oracle所需的全部,但是我已经在服务器上安装了11g和12c 64位Oracle客户端。 如果我打开64位ODBC管理器工具,则可以从服务器连接到数据库,这意味着没有连接问题。

错误消息中提到了Oracle.DataAccess.Client,但是我们正在使用Oracle.ManagedDataAccess.Client。在我们的代码,.csproj或packages.config中,没有任何地方引用非托管dll。 我在<clear />内尝试了各种<remove><DbProviderFactories>标签。我已将Oracle.DataAccess.dll从Oracle客户端安装位置直接复制到项目文件夹中。我已卸载,重新安装,重新部署。我已经将两个DLL都添加到了GAC中。似乎没有什么可以消除该错误的。

以下是配置文件的相关部分:

<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.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>
  <entityFramework>
    <providers>
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <clear />
      <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>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <publisherPolicy apply="no" />
        <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
        <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.122.18.3" />
      </dependentAssembly>        
      ...         
  <connectionStrings>
    <add name="<DB_MODEL_NAME>" connectionString="metadata=res://*/;provider=Oracle.ManagedDataAccess.Client;provider connection string='<CONNECTION_STRING>'" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

请注意连接字符串中的metadata=res://*/位。在我们的PC上,它显示为res://*/<DB_MODEL_NAME>.csdl|res://*/<DB_MODEL_NAME>.ssdl|res://*/<DB_MODEL_NAME>.msl。我根据其他一些帖子将其更新为metadata=res://*/。没有这个,抛出的错误是:

Error ::Unable to load the specified metadata resource.

我尝试了this article的建议,但似乎都没有用。如果我给它提供包含.edmx的程序集名称,它将抱怨它找不到该DLL,即使它位于已部署的文件夹中也是如此。

2 个答案:

答案 0 :(得分:0)

尼尔

一些问题可以帮助回答。

您是否正在使用Entity Framework Core?

您是否正在使用Oracle托管库?您完全可以从App / Web服务器连接到DB Server吗?您是否尝试过使用简单的控制台应用程序从应用程序/ Web服务器的服务器连接到数据库?

而且,从体系结构的角度来看。 https://docs.microsoft.com/en-us/aspnet/core/data/entity-framework-6?view=aspnetcore-2.2

最好是: 要使用Entity Framework 6,您的项目必须针对.NET Framework进行编译,因为Entity Framework 6不支持.NET Core。如果需要跨平台功能,则需要升级到Entity Framework Core。 在ASP.NET Core应用程序中使用Entity Framework 6的推荐方法是将EF6上下文和模型类放在针对整个框架的类库项目中。从ASP.NET Core项目添加对类库的引用。请参阅带有EF6和ASP.NET Core项目的示例Visual Studio解决方案。 您不能将EF6上下文放入ASP.NET Core项目中,因为.NET Core项目不支持EF6命令(如启用迁移)所需的所有功能。 但是,首先让我们解决第一个问题。

答案 1 :(得分:0)