【问题标题】:Oracle ODP.Net With Entity Framework 6 - Entity framework database compatible provider could not be found带有实体框架 6 的 Oracle ODP.Net - 找不到与实体框架数据库兼容的提供程序
【发布时间】:2015-02-23 17:30:55
【问题描述】:

我正在尝试使用适用于 Oracle Database 的 Entity Framework 6 构建 MVC 5 Web 应用程序,我正在尝试使用 ODAC 12c Release 3,其中包括对 Entity Framework 6 Code First 和 Code First 迁移的支持; NuGet,.NET 框架 4.5.2;和 ODP.NET,托管驱动程序 XML DB。根据

http://www.oracle.com/technetwork/topics/dotnet/whatsnew/index.html

我有 VS 2013 社区版更新 4 。

我正在尝试使用 ADO.Net 实体数据模型添加模型,代码优先。

我在我的 Web.config 中配置了以下内容

    <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="Tamayz.Context.Default, Tamayz.Context">
        <databaseInitializer type="MyProject.Context.Config.ContextInitializer, MyProject.Context" />
      </context>
    </contexts>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <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>

我还添加了 Oracle.ManagedDataAccess 版本 4.121.2.0 作为参考并重建解决方案。

我现在尝试使用 ADO.Net 实体数据模型添加模型,代码优先。但在向导的最后一个屏幕中收到以下消息:

您的项目引用了最新版本的实体框架;但是,无法为您的连接找到与此版本兼容的实体框架数据库提供程序...

如何正确配置我的应用程序,以便能够首先使用 ODAC 和 EF6 代码?

【问题讨论】:

标签: .net oracle entity-framework ado.net-entity-data-model odac


【解决方案1】:

我终于能够在 EF6 中使用 ODP。

我做了以下工作:-

首先安装 ODAC 12c Release 3,其中包括对 Entity Framework 6 Code First 和 Code First 迁移的支持; NuGet,.NET 框架 4.5.2;和 ODP.NET,托管驱动程序 XML DB。根据

http://www.oracle.com/technetwork/topics/dotnet/whatsnew/index.html

向我的项目引用添加两个引用,它们是:

Oracle.ManagedDataAccess.dll

Oracle.ManagedDataAccess.EntityFramework.dll

通过在包管理器控制台中运行以下命令使用NuGet安装EF6.1.1(您可以通过工具->NuGet包管理器->包管理器控制台输入):

Install-Package EntityFramework -Version 6.1.1

并修改您的 web.config 或 web.config 以使用 Oracle.ManagedDataAccess ,方法是添加 Provider 和有效的连接字符串,例如:

<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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <entityFramework>
    <contexts>
      <context type="App.Context.Default, App.Context">
        <databaseInitializer type="MyProject.Context.Config.ContextInitializer, MyProject.Context" />
      </context>
    </contexts>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="Default" providerName="Oracle.ManagedDataAccess.Client" connectionString="DATA SOURCE=XE;USER ID=User" />
  </connectionStrings>

将您的应用程序重建为 x86,并开始使用 EF6,您可以通过使用 Code First 使用 ADO.Net 实体模型添加模型来检查它是否有效

【讨论】:

  • 在我的应用程序中,我已经设置了所有内容,但我仍然遇到同样的错误。
  • 这可能是值得注意的。我在我的数据层库项目中引用了上述引用,但在 Web 应用程序项目中没有引用,因此出现此错误。无论出于何种原因,将 Oracle.ManagedDataAccess.EntityFramework 引用添加到我的应用程序项目可以解决它。
  • 好吧,我尝试手动操作时遇到了同样的问题,但所有这些问题都通过 ODP.NET Nuget 包解决:nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework。剩下的唯一问题是将项目构建更改为 x86。
  • @Wasef 在执行上述步骤之前,我收到了 OP 问题中提到的错误消息,即 Your project references that latest version of entity framework; however, an Entity Framework database Provider compatible with this version could not be found for your connection...,但现在在我在 Choose Your Data Connection' dialog and press Next, i dont see the Choose Your Version` 对话框中选择 Oracle 数据库时执行了这些步骤(我收到错误消息的对话框,而是直接转到Choose your Database Objects and Settings 的下一步
  • 请注意 - 您现在只需 Install-Package Oracle.ManagedDataAccess.EntityFramework 即可通过 Nuget 获取此信息。
【解决方案2】:

作为补充,我已经尝试了所有方法,但在我的情况下,它是通过设置“defaultConnectionFactory”来解决的,如下所示:

<entityFramework>
<defaultConnectionFactory type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory, Oracle.ManagedDataAccess.EntityFramework">
</defaultConnectionFactory>
<providers>
  <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</providers>
</entityFramework>

在这里找到解决方案:https://community.oracle.com/message/13114643#13114643

我希望它可以帮助某人......

【讨论】:

  • 实际上,如果您不想使用 ODAC 破坏您的机器,这是唯一的解决方案。先生干得好!
  • 谢谢!在尝试了其他所有方法后,这为我解决了。
  • 谢谢!由于版本兼容性问题,我有 ODAC,因此不使用托管驱动程序。对我来说,这也有效:Oracle.DataAccess.EntityFramework.OracleConnectionFactory
  • 是的,将 defaultConnectionFactory 更改为 Oracle 类型确实对我有用!谢谢!!
【解决方案3】:

我刚刚在 Visual Studio 2015 上遇到了这个问题。就我而言,这是由于 Entity Framework 6.1.3 不受支持。将其降级到 6.1.2 后,它就可以工作了。

【讨论】:

    【解决方案4】:

    迟到加入这个话题。有几个人升级到了 VS2017(我们团队的其他人仍在使用 VS2015 并计划升级到 VS2017)。我们的一个项目是通过本地引用的 dll 引用 Oracle.ManagedDataAccess.dll ver4.121.2.0 和 Oracle.ManagedDataAccess.EntityFramework.dll ver6.121.2.0。

    所有开发工作站都在系统范围内安装了 oracle-odac-drivers ver4.122.1.0 和 ver6.122.1.0(GAC 等)。

    这种设置在 VS2015 上运行良好,但由于某些奇怪的原因,它不适用于 VS2017。 VS2017 的罪魁祸首是 Oracle.ManagedDataAccess.dll 和 Oracle.ManagedDataAccess.EntityFramework.dll 没有被复制到我们的入门级 asp.net 项目的输出文件夹,除非并且直到本地引用的 dll 也更新到 ver4 .121.2.0 和版本 6.121.2.0。

    我们没有时间进一步研究这一切,但上述解决方案适用于 VS2017。

    【讨论】:

      【解决方案5】:

      对我来说,安装这个 Nuget 包是可行的。 https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

      【讨论】:

        【解决方案6】:

        我尝试了所选答案中的所有内容,但无法创建模型。我在所选答案的 cmets 中遇到了与 @WAQ 相同的问题,我没有收到错误消息,但它跳到了表格选择。

        我使用的是 VS2017 15.7.4、Oracle 12g 和 EF 6.1.1。

        我决定将 Oracle.ManagedDataAccess.EntityFrameworkOracle.ManagedDataAccess 从 18.3.0 降级到 12.2.1100,它终于奏效了!

        【讨论】:

          【解决方案7】:

          我还降级到 6.1.2,添加实体模型的所有问题都消失了。似乎 2015 年和 2017 年的 Visual Studio 都存在高于该版本的问题。 Oracle 需要尽快解决这个问题。

          【讨论】:

            【解决方案8】:

            我的电脑: 赢7 64位

            VS 2015

            甲骨文服务器:

            版本 12G - 32 位

            我所尝试的直到成功:

            -将 Oracle.ManagedDataAccess.EntityFramework 和 Oracle.ManagedDataAccess 从 18.3.0 降级到 12.2.20190115

            -将构建模式从任何 CPU 更改为 x86

            -配置app.config:

              <configSections>
                <section name="Oracle.ManagedDataAccess.Client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
            
                <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.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
              </configSections>
            
              <entityFramework>
                <defaultConnectionFactory type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory, Oracle.ManagedDataAccess.EntityFramework"></defaultConnectionFactory>
                <providers>
                  <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.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.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
                </DbProviderFactories>
              </system.data>
            

            -Nuget 已安装: Oracle.DataAccess.x86 - v.2.112.1

            Oracle.ManagedDataAccess.EntityFramework - v.12.2.20190115

            Oracle.ManagedDataAccess - v.12.2.1100

            EntityFramework - v.6.2.0

            已安装 ODAC:ODTwithODAC122011.zip

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-07-12
              • 2023-03-30
              • 2015-04-30
              • 2015-12-26
              • 2011-12-23
              • 2017-07-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多