【配置系统环境】
按照官方文档的指引,下载安装EF6插件、Oracle EF Visual Studio插件,详情如下:
https://msdn.microsoft.com/en-us/data/dn469466
https://msdn.microsoft.com/en-us/data/jj730568
http://www.oracle.com/technetwork/topics/dotnet/downloads/install121021-2389380.html
【配置工程环境】
Web.config 中configuration节点下添加如下数据库提供程序:
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework" /> </providers> </entityFramework>
编译成功,运行会发现一大堆的类型不匹配的错误。
如果是Database First的,重新生成数据模型,会发现Model的数据类型变了,EF6相对于EF5的数据类型更加严格,比如:
EF5 NUMBER(3) short
EF6 NUMBER(3) Byte
这在某些情况下是不能满足我们的需求的,只要在App.config和Web.config中configuration节点下添加下面的配置就可以了。
<oracle.manageddataaccess.client> <version number="*"> <edmMappings> <edmNumberMapping> <add NETType="int16" MinPrecision="1" MaxPrecision="5" DBType="Number"/> </edmNumberMapping> </edmMappings> </version> </oracle.manageddataaccess.client>
看到上面的配置,我们是不是可以把Number(1) 配置成Bool呢?根据需要吧。
【oracle ef 数据库读写分离】
我升级到EF6就是为了读写分离,EF6增加了DbCommandInterceptor过滤器,通过过滤器我们可以记录执行的脚本,更可以做自动读写分离,相关请参考两位牛人的博客。
1. http://www.cnblogs.com/lori/p/4208974.html
2. http://www.cnblogs.com/cjw0511/p/4391092.html
关于用哪个,看个人需求了,两种基本差不多。
第一种在每次读的时候创建新的连接,所以在多次读的时候相当于多次连接。
第二种在读的时候把连接转到读的,写的时候把连接转到写的,事务开始时转写的,不过目前事务处理上还有点bug
不管是哪种方案,如果在一次业务处理中,既要读又要写,建议创建两个数据库实例,避免全走主库或者导致读写交替关闭打开。