使用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 相关文章推荐
jquery 3D球状导航的文章分类
Jul 06 Javascript
JavaScript操作DOM元素的childNodes和children区别
Apr 01 Javascript
JavaScript实现带标题的图片轮播特效
May 20 Javascript
JS简单限制textarea内输入字符数量的方法
Oct 14 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
Oct 25 Javascript
Bootstrap每天必学之折叠
Apr 12 Javascript
js循环map 获取所有的key和value的实现代码(json)
May 09 Javascript
angularjs 动态从后台获取下拉框的值方法
Aug 13 Javascript
jQuery超简单遮罩层实现方法示例
Sep 06 jQuery
JavaScript代码调试方法实例小结
Jan 05 Javascript
在layui框架中select下拉框监听更改事件的例子
Sep 20 Javascript
vue实现整屏滚动切换
Jun 29 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入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
pdo中使用参数化查询sql
2011/08/11 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
2015/07/29 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP levenshtein()函数用法讲解
2019/03/08 PHP
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python使用wxpython开发简单记事本的方法
2015/05/20 Python
Python使用gensim计算文档相似性
2016/04/10 Python
python使用mysql的两种使用方式
2018/03/07 Python
python 文件转成16进制数组的实例
2018/07/09 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
python 获取一个值在某个区间的指定倍数的值方法
2018/11/12 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
C#基础面试题
2016/10/17 面试题
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
个人租房协议书
2014/04/09 职场文书
高中生操行评语
2014/04/25 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
党支部季度考核意见
2015/06/02 职场文书