使用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 相关文章推荐
javascript实现仿银行密码输入框效果的代码
Dec 13 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
May 05 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
May 11 Javascript
Javascript实现页面跳转的几种方式分享
Oct 26 Javascript
jQuery找出网页上最高元素的方法
Mar 20 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
Dec 26 Javascript
vue中使用element组件时事件想要传递其他参数的问题
Sep 18 Javascript
Preload基础使用方法详解
Feb 03 Javascript
在Vue中实现随hash改变响应菜单高亮
Mar 09 Javascript
vue 通过绑定事件获取当前行的id操作
Jul 27 Javascript
在vue中封装方法以及多处引用该方法详解
Aug 14 Javascript
原生JS实现九宫格抽奖
Sep 13 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脚本数据库功能详解(下)
2006/10/09 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
window.opener用法和用途实例介绍
2013/08/19 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
通过示例彻底搞懂js闭包
2017/08/10 Javascript
使用npm安装最新版本nodejs
2018/01/18 NodeJs
js捆绑TypeScript声明文件的方法教程
2018/04/13 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
js实现内置计时器
2019/12/16 Javascript
使用grappelli为django admin后台添加模板
2014/11/18 Python
python中threading超线程用法实例分析
2015/05/16 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
python绘制直方图和密度图的实例
2019/07/08 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
使用Python构造hive insert语句说明
2020/06/06 Python
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
QQ空间主人寄语大全
2014/04/12 职场文书
本科毕业生自荐信
2014/05/26 职场文书
商品陈列协议书
2014/09/29 职场文书
大连星海广场导游词
2015/02/10 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android