.NET Entity Framework (with Oracle ODP.NET) -Code First
上一篇文章介绍了.NET Entity Framework ,并演示了Model First模式,本文将继续讨论 Code First 模式的实现。
一、摘要
1、目标
本文验证了通过Oracle Data Provider for .NET (ODP.NET)使用Entity Framework (EF) Code First。先创建.NET类,通过框架在数据库中创建这些类对应的表;修改这些类,并通过Code First 将这些类的变化移植和映射到对应表中。
2、前言
Entity Framework 抽象关系型数据库的逻辑架构并映射到.NET应用中,为开发者提供了对象关系映射能力。Code First 让开发者开发的类转化为数据库的实体表。Code First Migrations 让类的变化精准地映射到数据库的对应表。
自从Oracle Data Access Components (ODAC) 12c Release 3 (12.1.0.2.1)这个版本开始,ODP.NET支持Code First 和 Code First Migrations 了,ODP.NET提供EF模型(Model)的数据库存、取及更新能力。
本文将建立EF程序,生成"Employee" 和"Department" 类,并添加这些类的对象数据。程序运行时,会将类映射到数据库表,并将对象存储为表记录行。然后为类添加新的属性,而这些属性会通过Code First Migrations添加到表的列信息。
3、环境条件
开始前,你应该满足以下条件:
- Visual Studio 2013 以上,.Net Framework 4.5以上
- Oracle 11g Release 2以上
- 将这些文件下载到你的工作目录(下载的文件为Programecs.txt)
- 请先阅读“通过NuGet 安装配置ODP.NET”,本文将告诉你如何安装和配置 Entity Framework 6 以及 ODP.NET,并通过一个控制台程序来验证相关使用。
- 如果你并不了解ODT是什么,本条可略。Oracle Developer Tools(ODT)可以集成到Visual Studio环境中辅助Oracle开发,但这对Code First并不是必须的。本文能过 Server Explorer 浏览Oracle数据库对象变化以验证Code First 对数据库的改变。如果你想用ODT的话请去Oracle官网上下载。
本文还将以Oracle 中自带的"HR"为例,但注意数据表对象的命名要避免冲突。
二、Code First
本部分将建两个类 "Employee" 、 "Department" ,并存储相关数据。当程序运行时,EF Code First会创建这两个类的对应表,并在生成类实例数据并保存时,会生成一个表的数据记录。
1、打开上一往篇文章中建立的项目(点此进入),打开app.config。在<connectionStrings> 配置节下修改用户名和密码,以连接HR数据库。注意链接的名字:OracleDbContext,我们会在后面的程序中用到这个名字

2、从下载的文件中copy出代码片段,粘到项目的Program.cs中。这段代码需要ODP.NET 和 EF 的相关配置,这些配置在前一篇文章中已配置好了。仔细阅读代码会发现,数据库操作类OracleDbContext 名字与第1步所提到的 <connectionStrings> 配置节中的名字相同。程序使用 连接串信息连接数据库,然后创建 Employee 和 Department 的实例,并生成数据。

如下图,看下这两个类在程序中如何定义的。每个类都包含有可被读取和保存的字段。其中一个字段(Location)被注释了,后续会去掉这个字段的注释。

如果你不想使用HR架构,你可以在代码" modelBuilder.HasDefaultSchema("HR"); " 中,将HR替换成你想用的架构。

3、运行程序,将在数据库中创建 "Employees" 和 "Departments" 表,并各添加一条数据。注意,这些表名是大小写敏感的。
4、检查一下数据库中,这些表各数据是否正常添加。运行完程序后,在Server Explorer 中点开 HR.ORCL链接。此步操作需要安装配置 ODT (Oracle Developer Tools for Visual Studio)

请输入正确的密码

展开表,检查在类中定义的两个表是否被创建

右键Departments和Employees ,查询表数据,验证数据与程序中插入的一致性。


三、Code First Migration
类会随着业务需求和数据库架构的变化而改变类定义,本部分会改变Employee类来模拟这种变化 。只需少量代码,就能使类的变化同步到数据库表。
在第二部分代码中,第三个表_MigrationHistory同时被创建。这个表会跟踪Code First 类的变化。
本步将演示在Employee类中添加字段 Location ,并将它同步到数据库表中。
1、依次打开 View > Other Windows > Package Manager Console. 这个窗口的功能是用来输入Code First 的迁移命令,以同步.NET类和数据库结构。

2、在窗口里输入 Enable-Migrations 。这个命令是允许开启 Code First Migrations 功能。

3、在Program.cs 中去掉注释,模拟在Employee类中添加字段的情形。

4、在PMC窗口输入 Add-Migration First ,框架将会为数据模型Model 的变化 生成迁移代码。

5、在窗口中键入 Update-Database ,变化将同步到数据库

6、再看下数据库表的变化 。在Server Explorer打开 Employees表

验证下Location字段是否被添加

四、总结
本文要点如下:
- 使用ODP.NET 创建 Code First 应用,将类及数据存储到数据库表中
- 使用 Code First Migrations 更新数据库结构
.NET Entity Framework (with Oracle ODP.NET) -Code First的更多相关文章
- .NET Entity Framework (with Oracle ODP.NET)
一.前言 1.Entity Framework是什么? Entity Framework是微软对ORM框架的实现.类似的实现也有其它方式,如DevExpress 的XPO(eXpress Persis ...
- Entity Framework 与ORACLE ODP.Net 在vs2010下的稀奇古怪的问题
不说废话 1.在vs2010数据源中看不到oracle odp.net 数据源,vs2008下可以看到,通过oraprocfg配置多次,重启多次,还是看不到,machine.config里面配置也正常 ...
- 让ADO.NET Entity Framework支持Oracle数据库
Oracle最近发布了 Oracle Data Access Component(ODAC)11. 2 Rel 4,其中增加了对 Entity Framework 4.1 和4.2的支持.这让 .NE ...
- [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) ...
- Entity Framework With Oracle
参考页面: http://www.yuanjiaocheng.net/Entity/first.html http://www.yuanjiaocheng.net/Entity/jieshao.htm ...
- Entity Framework With Oracle(转)
虽然EF6都快要出来了,但是对于Oracle数据库,仍然只能用DB first和Model First来编程,不能用Code First真是一个很大的遗憾啊. 好了,废话少说,我们来看看EF中是如何用 ...
- entity framework 连接 oracle 发布后出现的问题(Unable to find the requested .Net Framework Data Provider)
用entity framework 搭建的一个windows 程序,在vs中用oracle 的ODT 工具连接oracle数据库,昨天发布后出现下面一个错误, System.ArgumentExcep ...
- Entity Framework 5.0系列之Code First数据库迁移
我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...
随机推荐
- Vue router 全局路由守卫
记录一下全局路由守卫的使用: 方法一:定义一个数组用于检测与管理需要登录的页面,全局路由守卫配合本地存储判断是否跳转 import Vue from 'vue' import Router from ...
- 设置默认Browser
电信A库要求android系统中有多个Browser时,开机自动设置一个默认浏览器,而不用弹出选择框让用户手动选择. 监听开机广播Intent.ACTION_BOOT_COMPLETED, 用Pack ...
- 验证签名机制——java示例
简单的验证公钥私钥签名认证: 公钥是对外公开的部分,私钥是不公开的部分,一般在项目开发中公钥是给用户,私钥是存于服务器上,二者中有一个加密,则需要另外一个来解密. 下面是java实现的一个比较简单的示 ...
- POJ-3252 Avenger
题意:在区间中,他们化成2进制的数的0的个数大于等于1的数有多少个. 思路:我们需要记录上一次0和1的个数,此外我们还要特别注意一下前导0. 如果前面全是0的时候我们就要注意下一位是不是还是0,如果一 ...
- python学习 day3 (3月4日)---字符串
字符串: 下标(索引) 切片[起始:终止] 步长[起始:终止:1] 或者-1 从后往前 -1 -2 -3 15个专属方法: 1-6 : 格式:大小写 , 居中(6) s.capitalize() s ...
- Django的学习(六)————templates过滤器、Django shell、admin
一.filter: 1.介绍: 写在模板中,属于Django的模板语言. 可以修改模板中的变量,从而显示不同的内容 2.使用: {{ value | filter }},且过滤器可以嵌套使用 < ...
- 《从0到1》深度阅读笔记zz
没有人能精准地预测未来,我们只知道两件事:一是世界必然会变得不同:二是现在再好的描述也不能让我们看到清晰的未来. 创业者把成就归功于商业模式和机会窗口,归功于创业者本人拥有的资源和能力,但还有一个最重 ...
- 指令发布中如何实现new新消息的提醒?
设计思路:反馈后,最急需了解反馈结果的是申请人,故给每一条反馈信息添加一个查看状态的字段,如CK_STATUS,并为这个状态设计为char(1)类型,java bean中使用integer可以实现默认 ...
- 4. Father's Impact on a Child's Language Development 父亲对孩子语言发展的影响
4. Father's Impact on a Child's Language Development 父亲对孩子语言发展的影响 (1)Im families with two working pa ...
- Tomcat入门
1.JavaWeb概念 Java web,是用java技术来解决相关web互联网领域的技术的总称.web包括:web服务器和web客户端两部分.java在最早web客户端的应用有java applet ...