Entity Framework With Oracle
参考页面:
http://www.yuanjiaocheng.net/Entity/first.html
http://www.yuanjiaocheng.net/Entity/jieshao.html
http://www.yuanjiaocheng.net/entity/tixijiegou.html
http://www.yuanjiaocheng.net/entity/setenvrionment.html
http://www.yuanjiaocheng.net/entity/createdatamodel.html
虽然EF6都快要出来了,但是对于Oracle数据库,仍然只能用DB first和Model First来编程,不能用Code First真是一个很大的遗憾啊。
好了,废话少说,我们来看看EF中是如何用DB first和Model First来对Oracle编程的。
首先我们要下载ODP.NET这个数据驱动程序,下载链接:http://www.oracle.com/technetwork/topics/dotnet/index-085163.html
安装成功后,我们在VS连接Oracle数据库时就可以选择ODP.NET了,如图:
Model First
模型优先是先建立数据模型,然后再根据模型生成相应的数据库脚本,然后再根据脚本生成数据库。
在项目中新增一个ADO.NET实体模型:OracleModel.edmx,选择“空模型”,再新新建两个实体:Destination与Lodging,如图:
为了看清这两个模型中属性的数据类型,我把他们生成的类也贴出来一下:
public partial class Destination { public Destination() { this.Lodging = new HashSet<Lodging>(); } public int DestinationId { get; set; } public string Name { get; set; } public string Country { get; set; } public byte Photo { get; set; } public string Description { get; set; } public virtual ICollection<Lodging> Lodging { get; set; } } public partial class Lodging { public int LodgingId { get; set; } public string Name { get; set; } public string Owner { get; set; } public bool IsResort { get; set; } public decimal MilesFromNearestAirport { get; set; } public int DestinationDestinationId { get; set; } public virtual Destination Destination { get; set; } }
实体模型的空白处,右键-属性,在打开的OracleModel模型属性窗口,设置一些属性,将DDL生成模板改成:SSDLToOracle.tt (VS),数据库架构名称改成:GYOUNG(这是我自己测试的Oracle数据库的用户名,大家可根据自己的更改),数据库生成工作流改成:Generate Oracle Via T4 (TPT).xaml (VS)
为了让EF更好的明白.NET中的数据类型与Oracle中数据类型间的对应关系。我们可以将下面的配置文件加到app.config中。
<oracle.dataaccess.client> <settings> <add name="bool" value="edmmapping number(1,0)" /> <add name="byte" value="edmmapping number(3,0)" /> <add name="int16" value="edmmapping number(4,0)" /> <add name="int32" value="edmmapping number(9,0)" /> <add name="int64" value="edmmapping number(18,0)" /> </settings> </oracle.dataaccess.client>
现在我们就可以生成数据库的相应脚本了。
在空白处右键,选择“根据模型生成数据库”
然后建立好数据连接,如图:
点击下一步,然后就会生成相应的数据脚本。
-- Creating table 'Destinations' CREATE TABLE "GYOUNG"."Destinations" ( "DestinationId" ,) NOT NULL, "Name" NCLOB NOT NULL, "Country" NCLOB NOT NULL, "Photo" ,) NOT NULL, "Description" NCLOB NOT NULL ); -- Creating table 'Lodgings' CREATE TABLE "GYOUNG"."Lodgings" ( "LodgingId" ,) NOT NULL, "Name" NCLOB NOT NULL, "Owner" NCLOB NOT NULL, "IsResort" ,) NOT NULL, "MilesFromNearestAirport" ,) NOT NULL, "DestinationDestinationId" ,) NOT NULL ); -- -------------------------------------------------- -- Creating all PRIMARY KEY constraints -- -------------------------------------------------- -- Creating primary key on "DestinationId"in table 'Destinations' ALTER TABLE "GYOUNG"."Destinations" ADD CONSTRAINT "PK_Destinations" PRIMARY KEY ("DestinationId" ) ENABLE VALIDATE; -- Creating primary key on "LodgingId"in table 'Lodgings' ALTER TABLE "GYOUNG"."Lodgings" ADD CONSTRAINT "PK_Lodgings" PRIMARY KEY ("LodgingId" ) ENABLE VALIDATE; -- -------------------------------------------------- -- Creating all FOREIGN KEY constraints -- -------------------------------------------------- -- Creating foreign key on "DestinationDestinationId" in table 'Lodgings' ALTER TABLE "GYOUNG"."Lodgings" ADD CONSTRAINT "FK_DestinationLodging" FOREIGN KEY ("DestinationDestinationId") REFERENCES "GYOUNG"."Destinations" ("DestinationId") ENABLE VALIDATE; -- Creating index for FOREIGN KEY 'FK_DestinationLodging' CREATE INDEX "IX_FK_DestinationLodging" ON "GYOUNG"."Lodgings" ("DestinationDestinationId"); -- -------------------------------------------------- -- Script has ended -- --------------------------------------------------
我们只要将脚本到数据库中执行一下就可以生成相应的表了。分析一下生成的SQL语句,有主键,外键,但并没有为主键设置自增长。Oracle设置自增长也是一个很蛋疼的问题,要通过设置相应的Sequences和Triggers来实现,习惯了SQL SERVER的IDENTITY,对于这个还真不爽。这里我们不管它,就自己插入主键好了。下面是测试代码:
using (OracleModelContainer context = new OracleModelContainer()) { var destination = new Destination { DestinationId=, Country = "Indonesia", Description = "EcoTourism at its best in exquisite Bali", Name = "Bali" }; var lodging = new Lodging { LodgingId=, Owner="Jshon", Name = "Top Notch Resort and Spa", MilesFromNearestAirport = , IsResort=true, Destination=destination }; context.Lodgings.Add(lodging); context.SaveChanges(); }
通过VS连接Oracle可以看到数据插入成功。
DB First
DB First顾名思义就是在先建好数据库,再进行编程。我们新建一个项目,就以刚刚生成的那再张表来编程。
在新建项目中添加一个“ADO.NET 实体数据模型”:DBModel.edmx,选择“从数据库生成”
设置好连接串
选择表
点击完成,就会生成相应的模型。
我们来检索一下刚刚插入的数据。
using (Entities context = new Entities()) { var des = context.Destinations.FirstOrDefault(); var log = context.Lodgings.FirstOrDefault(); Console.WriteLine("Lodging Name:" + log.Name + " Owner:" + log.Owner); Console.WriteLine("Destination Name:" + des.Name + " Country:" + des.Country); }
结果如图。
PS:在DB First模式中,更要将Model First中所说的映射配置文件加入App.config中,不然很多数据类型映射会出错。
伪Code First
见我的另一篇博客:Entity Framework Code First在Oracle下的伪实现
Entity Framework With Oracle的更多相关文章
- [VSTS]让ADO.NET Entity Framework支持Oracle数据库(转载)
近期由于项目所需不得不研究Oracle数据库,回想上一次用Oracle还是07年的事情,实习时候做华晨宝马的项目简单接触了Oracle.这次的项目需要基于.NET平台,我个人的习惯是能用微软自带的就不 ...
- 使用entity framework开发oracle
A.vs2010 SP1 B.ODAC(http://www.oracle.com/technetwork/database/windows/downloads/index-101290.html) ...
- 让ADO.NET Entity Framework支持Oracle数据库
Oracle最近发布了 Oracle Data Access Component(ODAC)11. 2 Rel 4,其中增加了对 Entity Framework 4.1 和4.2的支持.这让 .NE ...
- Entity Framework 与ORACLE ODP.Net 在vs2010下的稀奇古怪的问题
不说废话 1.在vs2010数据源中看不到oracle odp.net 数据源,vs2008下可以看到,通过oraprocfg配置多次,重启多次,还是看不到,machine.config里面配置也正常 ...
- entity framework 连接 oracle 发布后出现的问题(Unable to find the requested .Net Framework Data Provider)
用entity framework 搭建的一个windows 程序,在vs中用oracle 的ODT 工具连接oracle数据库,昨天发布后出现下面一个错误, System.ArgumentExcep ...
- ODAC的安装以及Entity Framework for Oracle 基本配置
1.安装ODAC 根据自己操作系统x86,x64来判断下载的ODAC版本 http://www.oracle.com/technetwork/database/windows/downloads/ut ...
- .NET Entity Framework (with Oracle ODP.NET) -Code First
上一篇文章介绍了.NET Entity Framework ,并演示了Model First模式,本文将继续讨论 Code First 模式的实现. 一.摘要 1.目标 本文验证了通过Oracle D ...
- .NET Entity Framework (with Oracle ODP.NET)
一.前言 1.Entity Framework是什么? Entity Framework是微软对ORM框架的实现.类似的实现也有其它方式,如DevExpress 的XPO(eXpress Persis ...
- Entity Framework With Oracle(转)
虽然EF6都快要出来了,但是对于Oracle数据库,仍然只能用DB first和Model First来编程,不能用Code First真是一个很大的遗憾啊. 好了,废话少说,我们来看看EF中是如何用 ...
随机推荐
- WCF中队列服务详解
WCF中队列服务详解 一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务 ...
- leetcode[89] Merge Sorted Array
合并两个有序数组,放在A中,A中的空间足够. Given two sorted integer arrays A and B, merge B into A as one sorted array. ...
- 20个很有用的CSS技巧
导语:下面这几个CSS技巧你可能不知道,1.彩色照片变黑白,2.所有元素垂直居中,3.禁用鼠标,4.模糊文字,小编学完能量满满的,觉得对CSS又充满了爱,你也来看看. 1. 黑白图像 这段代码会让你的 ...
- ASP.NET MVC Model元数据
ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...
- awk学习点滴
1,常量 ARGC:命令行参数个数 包括awk本身命令,但awk的自带option不算在内. ARGV:命令行参数数组 ARGV[0]是awk本身,其他依次提取就好. $ awk -F ' ' 'BE ...
- ASP.NET Web Api构建基于REST风格的服务实战系列教程
使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[十]——使用CacheCow和ETag缓存资源 系列导航地址http://www.cnblogs.com/fzrain/p/3 ...
- Mac OS X安装之虚拟机环境下的总结
最近一直忙着公司iOS Touch的新版发布,终于忙过了.现在,又开始了新的阶段,不过算是轻松了很多.回来一看,自己的博客空空如也,实在受不了了.于是,开始更一下吧,哈哈. 这个文档是我几个月前,开始 ...
- twitter 授权过程
转自:http://blog.csdn.net/yangjian8915/article/details/11816669 官方的流程图如下: 下面开始一步步讲解,如何获取最终的access_toke ...
- [转]unload dynamic library needs two dlclose() calls?
src: http://stackoverflow.com/questions/8793099/unload-dynamic-library-needs-two-dlclose-calls Quest ...
- OJ题目JAVA与C运行效率对比
[JAVA]深深跪了,OJ题目JAVA与C运行效率对比(附带清华北大OJ内存计算的对比) 看了园友的评论之后,我也好奇清橙OJ是怎么计算内存占用的.重新测试的情况附在原文后边. ----------- ...