使用ef6创建oracle数据库的实体模型遇到的问题及解决方案


Posted in Javascript onNovember 09, 2017

解决方案中的数据层项目最初使用的是oracle 11g + ef5 创建的实体模型,在分页时遇到了skip参数为0报错的问题,没有找到相关资料。

于是决定升级到ef6,在oracle官网中得知,Oracle Data Provider for .NET in ODAC 12c Release 3 开始支持ef6(https://docs.oracle.com/cd/E56485_01/win.121/e55744/release_changes.htm#CIHGIAEG)

安装步骤:

1.安装odac,下载地址http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html

2.数据层项目的.net版本改成4.5以上,使用nuget安装 EntityFramework 6 +Oracle.ManagedDataAccess +Oracle.ManagedDataAccess.EntityFramework,都安装最新稳定版。

安装后app.config和web.config都会被加入如下配置项

<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.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
 </configSections>
 <entityFramework>
 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
  <parameter value="mssqllocaldb" />
  </parameters>
 </defaultConnectionFactory>
 <providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  <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>
 <runtime>
 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
  <publisherPolicy apply="no" />
  <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
  </dependentAssembly>
 </assemblyBinding>
 </runtime>
 <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>

注意 entityFramework和 system.data中的版本号,nuget安装后自动生成的一般没问题,我在安装之前把网上找的资料里的配置项放在里面了,但是版本号不一致,程序启动不了,一直没注意到版本号,

找了好一会才发现是这两个地方。

3.然后就可以添加实体模型了。此时如果vs中显示找不到与ef6 兼容的实体框架提供程序,需要将配置文件中的ef节的 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />删掉或者注释掉,保存后再重新尝试添加实体模型。

添加实体模型时需要先不选择数据库里的表,即生成空模型,然后打开edmx文件,在模型浏览器中选中实体模型,在属性中把DDL生成模板改成SSDLToOracle.tt (VS),数据库生成工作流改成Generate Oracle Via T4 (TPT).xaml (VS)。

这么做的原因是如果DDL生成模板使用默认项SSDLToOracle.tt ,oracle中的number(1,0)和number(2,0)类型的字段生成的实体属性的类型会是int16,然后运行的时候报映射不匹配的错误(错误代码2019)。

报错原因是oracle从ODP.NET 12.1.0.2开始为ef6采用新的默认类型映射,官网说明https://docs.oracle.com/cd/E56485_01/win.121/e55744/entityDataTypeMapping.htm#ODPNT8303,其中的 New Default Mappings 段。

SSDLToOracle.tt模板生成的属性的类型是number(1,0)对应boolean,number(2,0)对应byte,这个对应关系与新映射是一致的。

附上ef5的映射

Oracle Type Default EDM Type Custom EDM Type
Number(1,0) Int16 bool
Number(2,0) to Number(3,0) Int16 byte
Number(4,0) Int16 Int16
Number(5,0) Int16 Int32
Number(6,0) to Number(9,0) Int32 Int32
Number(10,0) Int32 Int64
Number(11,0) to Number(18,0) Int64 Int64
Number(19,0) Int64 Decimal

总结

以上所述是小编给大家介绍的使用ef6创建oracle数据库的实体模型遇到的问题及解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js 中 document.createEvent的用法
Aug 29 Javascript
jQuery产品间断向下滚动效果核心代码
May 08 Javascript
Bootstrap3 多选和单选框(checkbox)
Dec 29 Javascript
原生js实现可拖动的登录框效果
Jan 21 Javascript
JS实现针对给定时间的倒计时功能示例
Apr 11 Javascript
Vue 进阶教程之v-model详解
May 06 Javascript
详解js静态资源文件请求的处理
Aug 01 Javascript
AngualrJs清除定时器遇到的坑
Oct 13 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
Jan 08 Javascript
vue观察模式浅析
Sep 25 Javascript
Vue自定义属性实例分析
Feb 23 Javascript
微信小程序云开发(数据库)详解
May 17 Javascript
基于vue配置axios的方法步骤
Nov 09 #Javascript
微信小程序倒计时功能实现代码
Nov 09 #Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
Nov 09 #jQuery
微信小程序获取手机号授权用户登录功能
Nov 09 #Javascript
jQuery.Sumoselect插件实现下拉复选框效果
Nov 09 #jQuery
webpack中CommonsChunkPlugin详细教程(小结)
Nov 09 #Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
Nov 09 #Javascript
You might like
自己写了一个php检测文件编码的函数
2014/04/21 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
原生JS实现随机点名项目的实例代码
2019/04/30 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
雅虎笔试题(字符串操作)
2015/03/24 面试题
出纳岗位职责范本
2013/12/01 职场文书
难忘的一天教学反思
2014/04/30 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
七年级作文之游记
2019/12/11 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
django 认证类配置实现
2021/11/11 Python
python 多态 协议 鸭子类型详解
2021/11/27 Python
千万级用户系统SQL调优实战分享
2022/03/03 MySQL
Java基础——Map集合
2022/04/01 Java/Android
sql注入报错之注入原理实例解析
2022/06/10 MySQL