让Vs2013 完美支持EF6.1 Code First with Oracle 2015年12月24日更新
本文是对下文的补充,切勿以为我是全盘复制哦
连接:
http://www.cnblogs.com/wlflovenet/p/4187455.html
Entity Framework6 with Oracle(可实现code first)
本人项目代码版本
VS2013 Update 4
Oracle 服务端是Oracle11gr2,而后各种Oracle服务端,还有各种客户端,具体原因不多述,导致本人开发的程序,全部必须使用ODP.NET, Managed Driver
ODP.NET, Managed Driver 分为两种,一种是自带在ODP.Net安装包(此安装包只分32位安装版本和64位 XCOPY版本),一种是只有9M的zip包
微软的Nuget上不是最新的,目前支持EntityFramework (6.0.0.0)的只 有Oracle官网上的ODTwithODAC121021.zip,ODP.NET_Managed121020.zip,两个版本
PS:上面那段话我已经删除,原因是最近发现出了新版本的ODP.NET,不仅仅是自带了托管式驱动,而且还包含了MSI安装包,并且XCOPY版本的(即时客户端)也有了32位/64位的啦
地址为:http://www.oracle.com/technetwork/topics/dotnet/downloads/net-downloads-160392.html
在多嘴一句,如果有更新之后,没有在服务器资源管理器添加新数据连接里看到ODP的托管式驱动/非托管驱动 ,那么有两种可能
1.你没有按照下文所说的,加入一个默认的Oracle连接字符串,注册Oracle的托管式驱动在config里,按照下文修改下config文件即可
2.你的Oracle客户端/服务端没有卸载干净,本机上的Oracle有冲突,那么你就要赶紧清理Oracle的注册表残留了(这就是比Linux麻烦的一点),还要检查系统设置里的Patch里选项,是否还残留Oracle的安装目录调用之类的。
3.读取数据库表结构也需要一定的权限,如果权限不足,也会读取不到任何表(此项待验证)
解决办法:
在面那个链接地址里,你会看到如下的5个链接,
第一个是ODP.NET的安装客户端(自带Oracle客户端一个,即时客户端一个),跟安装了Oracle客户端性质差不多,但是好像是没有32位的驱动
会导致PLSQL连接不上,具体你们自己测试就知道了,一般装这个,就可以在服务器资源管理器添加新数据连接里看到ODP的托管式驱动/非托管驱动,此法通杀vs2010,vs2012,vs2013 一切版本
第四,第五链接是最近出的,好像装了,就会自动给你注册托管式DLL,并且注册相关的注册表事项,是否和第一个链接类似,不太清楚,偶也是第一次用,大家自行测试吧
- 32-bit ODAC with Oracle Developer Tools for Visual Studio Downloads
- 32-bit ODAC Xcopy and NuGet Downloads
- 64-bit ODAC Downloads - Oracle Universal Installer and Xcopy
- Oracle Developer Tools for Visual Studio 2015 - MSI Installer
- Oracle Developer Tools for Visual Studio 2013 - MSI Installer
鉴于某些伸手党同学不太明白我这到底改了哪里,我特意上传一份我已经支持的config文件内容,
需要注意的一点是,如果是你本机上已经安装过Oracle 的ODP.Net的其他版本,请自行查看maching.config(也区分32位和64位)中是否有类似下面标红的地方( <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />)这样的注册
如果没有,则证明没有安装ODP.NET,自己装一个即可,如果是托管式驱动,则无需此步骤,
如果在其他机器打开源代码,进行开发的时候,记得把上面那段话先注释掉,会有冲突
<?xml version="1.0" encoding="utf-8"?> <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" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <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 --> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> </configSections> <entityFramework> <defaultConnectionFactory type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> <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> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> <dependentAssembly> <publisherPolicy apply="no" /> <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" /> <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </DbProviderFactories> </system.data> <oracle.manageddataaccess.client> <version number="*"> <dataSources> <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " /> </dataSources> </version> </oracle.manageddataaccess.client> <connectionStrings> <add name="00_Entities" connectionString="metadata="res://*/Entity Data Model.00.DB_00.csdl|res://*/Entity Data Model.**.**.ssdl|res://*/Entity Data Model.**.**.msl";provider=Oracle.ManagedDataAccess.Client;provider connection string="DATA SOURCE=192.13.11.102:1521/00;PASSWORD=006tsl;PERSIST SECURITY INFO=True;USER ID=00"" providerName="System.Data.EntityClient" /> <add name="TPL_Entities" connectionString="metadata="res://*/Entity Data Model.TPL.DB_TPL.csdl|res://*/Entity Data Model.TPL.DB_TPL.ssdl|res://*/Entity Data Model.TPL.DB_TPL.msl";provider=Oracle.ManagedDataAccess.Client;provider connection string="DATA SOURCE=192.13.11.102:1521/ORCL;PASSWORD=1l;PERSIST SECURITY INFO=True;USER ID=OP0"" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>
省略千字,进入正题,如果出现下面这个信息(相信很多人都和我一样被微软给迷惑了)
其实是我们基础学的好不好,此处上文提到园友其实已经给出了解决办法
那就是修改Web.config;
把
改为
<entityFramework> <defaultConnectionFactory type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> <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>
记得
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
这句话要加到
<configSections> </configSections> 里
如果没有默认的连接对象,自己手写个即可
就是 <connectionStrings>
</connectionStrings>里加入一个你自己默认要用的连接字符串即可,完成生成之后,这个删除都行的
到此步,基本上都能用,我就可耻的隐匿了,要感谢wlf提供了如此好的文章,我只是一个搬运工,谢谢残冰给与的ef使用指导,感谢死胖子你那脑洞大开的ef bug论
PS:如果发现我文章中的Oracle.ManagedDataAccess版本和我上面提到的文章作者说的版本不一致,那是因为我这个是最新的,最新版本是4.121.2.0
我是64位的win8.1 装的ODP.Net(这玩意只有32位的),安装之后,VS2013和VS2010里就会自带有Oracle.ManagedDataAccess。
Oracle官网地址
http://www.oracle.com/technetwork/topics/dotnet/downloads/net-downloads-160392.html (已更新)