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中是如何用 ...
随机推荐
- 机器学习学习-Types of learning
Types of learning 基于个人理解.于我们在面对一个详细的问题时.可以依据要达到的目标选择合适的机器学习算法来得到想要的结果.比方,推断一封电子邮件是否是垃圾邮件,就要使用分类(clas ...
- 提高C#编程水平的50个要点 你掌握了多少呢?
提高C#编程水平的50个要点,程序员都是追求极致的完美主义者,下面的这些注意点和要点,你都掌握运用了多少呢? 总是用属性(Property)来代替可访问的数据成员 在 readonly 和 const ...
- Linux下查看使用频率最高的十个命令
这个shell是在linux吧一个小伙伴发的,链接已找不到,挺有意思的,隔段时间运行一次,可以看看自己最近都干了什么. [shell] history | awk '{CMD[$2]++;count+ ...
- Java泛型和集合之泛型介绍
在声明一个接口和类的时候可以使用尖括号带有一个或者多个参数但是当你在声明属于一个接口或者类的变量的时候或者你在创建一个类实例的时候需要提供他们的具体类型.我们来看下下面这个例子 List<Str ...
- 在windows server2003下安装Redmine
原文:在windows server2003下安装Redmine 参考文献:Windows下使用_Ruby1.9.3安装RedMine2.2.3 参考资料:http://www.redmine.org ...
- 打开VMware的系统出错
打开VMware系统时,出现错误 “Invalid configuration file. File "I:/My Virtual Machines/Windows XP english P ...
- 【转】在PC上测试移动端网站和模拟手机浏览器的5大方法
查了很多资料,尝试了大部分方法,下面将这一天的努力总结下分享给大家,也让大家免去看那么多文章,以下介绍的方法,都是本人亲自测试成功的方法,测试环境winxp. 一.Chrome*浏览器 chrome模 ...
- C#程序员阅读的书籍
推荐几本C#程序员阅读的书籍 楼主这些年一直追随微软技术,也看了不少书籍,整理出一些个人认为不错的经典,推荐给各位阅读,以共同进步. 推荐顺序是由浅入深,深入浅出. <Professiona ...
- DropDownList和GridView用法
DropDownList和GridView用法 DropDownList控件和GridView控件在Asp.net中相当常用,以下是控件的解释,有些是常用的,有些是偶尔的,查找.使用.记录,仅此而 ...
- 目前比较流行的Python科学计算发行版
经常有身边的学友问到用什么Python发行版比较好? 其实目前比较流行的Python科学计算发行版,主要有这么几个: Python(x,y) GUI基于PyQt,曾经是功能最全也是最强大的,而且是Wi ...