我正在尝试使用适用于Oracle数据库的Entity Framework 6构建MVC 5 Web应用程序,我正在尝试使用ODAC 12c第3版,其中包括对Entity Framework 6 Code First和Code First Migrations的支持; NuGet,.NET Framework 4.5.2;和ODP.NET,托管驱动程序XML DB。按照
http://www.oracle.com/technetwork/topics/dotnet/whatsnew/index.html
我有VS 2013社区版更新4。
尝试使用ADO.Net实体数据模型添加模型,使用Code First。
我在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实体数据模型添加模型,使用Code First。但是在向导的最后一个屏幕中收到以下消息:
您的项目引用了最新版本的实体框架;但是,找不到与此版本兼容的Entity Framework数据库提供程序...
如何正确配置我的应用程序以便能够首先使用带有EF6代码的ODAC?
答案 0 :(得分:40)
我终于能够在EF6上使用ODP了。
我做了以下工作: -
首先安装ODAC 12c第3版,其中包括对实体框架6代码优先和代码优先迁移的支持; NuGet,.NET Framework 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(可以通过Tools-&gt; NuGet软件包管理器 - &gt;软件包管理器控制台输入):
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,您可以使用代码优先使用ADO.Net实体模型添加模型来检查它是否有效
答案 1 :(得分:18)
为了补充,我已尝试过所有内容,但在我的情况下,它是通过设置&#34; defaultConnectionFactory &#34;来解决的,如下所示:
<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
我希望它有助于某人...
答案 2 :(得分:2)
对我来说,安装这个Nuget包是有效的。 https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/
答案 3 :(得分:2)
我尝试了所选答案中的所有内容,但无法创建模型。在所选答案的注释中,我遇到了与@WAQ相同的问题,我没有收到错误消息,但跳到了表选择。
我正在使用VS2017 15.7.4,Oracle 12g和EF 6.1.1。
我决定将Oracle.ManagedDataAccess.EntityFramework
和Oracle.ManagedDataAccess
的版本从18.3.0降级到12.2.1100,终于奏效了!
答案 4 :(得分:1)
我刚刚在visual studio 2015上遇到过这个问题。在我的情况下,这是由于Entity Framework 6.1.3不受支持。在将其降级到6.1.2后,它正在工作。
答案 5 :(得分:1)
迟到加入此主题。有几个人升级到VS2017(我们团队的其他人仍在使用VS2015并计划升级到VS2017)。我们的一个项目是引用Oracle.ManagedDataAccess.dll ver4.121.2.0&amp; Oracle.ManagedDataAccess.EntityFramework.dll ver6.121.2.0通过本地引用的dll。
所有开发工作站都有oracle-odac-drivers ver4.122.1.0&amp; ver6.122.1.0安装在全系统(GAC等)。
这种设置对于VS2015工作得很好但是出于一些奇怪的原因它不能用于VS2017。 VS2017的罪魁祸首是Oracle.ManagedDataAccess.dll&amp; Oracle.ManagedDataAccess.EntityFramework.dll不会被复制到我们的入门级asp.net项目的输出文件夹,除非并且直到本地引用的dll也更新到ver4.121.2.0&amp; ver6.121.2.0。
我们没有时间进一步研究这一切,但上述解决方案适用于VS2017。
答案 6 :(得分:1)
我也降级到6.1.2,添加实体模型的所有问题都消失了。似乎2015和2017 Visual Studio都存在版本高于此的问题。 Oracle需要尽快查看。
答案 7 :(得分:0)
我的电脑: 赢7 64位
VS 2015
Oracle服务器:
版本12G-32位
直到成功我一直尝试的事情:
-将Oracle.ManagedDataAccess.EntityFramework和Oracle.ManagedDataAccess的版本从18.3.0降级到12.2.20190115
-将Build模式从Any 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