Oracle中使用Entity Framework 6.x Code-First方式开发
去年写过一篇EF的简单学习笔记,当时EF还不支持Oracle的Code-First开发模式,今天无意又看了下Oracle官网,发现EF6.X已经支持了,并且给出了二篇教程(英文版):
1.Using NuGet to Install and Configure Oracle Data Provider for .NET
2.Entity Framework Code First and Code First Migrations for Oracle Database
基本上照着做就行了,为了方便不愿意啃英文的朋友,把主要步骤"意译"了下:
环境: Visual Studio 2013 + .Net Framework 4.5.2
1. 使用NuGet安装、配置ODP.NET
a) 参考下图,创建一个Console Application的项目
项目名称随便吧,图中是NuGet
这是主程序入口
b) 打开Solution 视图
项目的References引用节点右击,选择Manage NuGet Packages...
参考下图,搜索Oracle,安装图中的二项:
安装过程中,会弹出License对话框,点击I Accept
安装成功后,这二项应该会自动打上绿勾
安装完成后,会自动打开readme.txt,地球人一般都不看这玩意儿
检查下项目的References,参考下图,应该看到自动添加了4个新的dll引用
再看下App.config
会自动添加以下内容:
下图这二个地方,是用来配置连接字符串的,记得修改
ok, ODP.Net安装配置完成
2.使用Code First模式开发
a) 先参考下图,修改连接字符串(本文用的是HR这个示例用户,大家可以根据实际情况修改)
打开Program.cs这个文件
换成下面这段代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Xml.Linq;
6 using System.Data.Common;
7 using System.Data.Entity;
8 using System.Data.Entity.Core.Objects;
9 using System.Data.Entity.Migrations;
10 using System.Data.Entity.Infrastructure;
11 using System.Data.Entity.Migrations.History;
12 using System.ComponentModel.DataAnnotations;
13 using System.ComponentModel.DataAnnotations.Schema;
14
15 namespace EFCodeFirst
16 {
17 class Program
18 {
19 static void Main(string[] args)
20 {
21 Database.SetInitializer(new DropCreateDatabaseAlways<OracleDbContext>());
22
23 using (var ctx = new OracleDbContext())
24 {
25 var emp = new Employee
26 {
27 Name = "Tom",
28 HireDate = DateTime.Now
29 };
30
31 ctx.Employees.Add(emp);
32 ctx.SaveChanges();
33
34 var dept = new Department
35 {
36 Name = "Accounting",
37 ManagerId = emp.EmployeeId
38 };
39
40 ctx.Departments.Add(dept);
41 ctx.SaveChanges();
42 }
43
44 Console.Write("Press any key to continue... ");
45 Console.ReadLine();
46 }
47 }
48
49
50 public class Employee
51 {
52 public int EmployeeId { get; set; }
53 public string Name { get; set; }
54 public DateTime HireDate { get; set; }
55 //public string Location { get; set; }
56 }
57
58 public class Department
59 {
60 public int DepartmentId { get; set; }
61 public string Name { get; set; }
62 [ForeignKey("Manager")]
63 public int ManagerId { get; set; }
64 public Employee Manager { get; set; }
65 }
66
67 public class OracleDbContext : DbContext
68 {
69 public DbSet<Employee> Employees { get; set; }
70 public DbSet<Department> Departments { get; set; }
71
72 protected override void OnModelCreating(DbModelBuilder modelBuilder)
73 {
74 modelBuilder.HasDefaultSchema("HR");
75 }
76 }
77 }
下面是主要的调用代码,演示了insert记录
下面是实体类的定义,完全是POJO对象,可以借助工具或纯手写.
下面是DbContext部分,相当于DAL层.注意:OnModelCreating,这里表示根据Model创建表时,默认将创建到HR这个Database Schema下
运行结果
打开Server Explorer面板
连接到Oracle
可以看到根据Model定义,自动生成了二张表(注意下表名,自动加了复数)
可以直接查看数据
可以看到,成功插入了2条数据
b) Model与数据库的迁移合并
数据实体模型的类定义,往往随着需求的变化而变化,如果增加或减少了属性,EF可以自动生成相应的db脚本,同步修改表结构
先参考下图,进入PM控制台
输入Enable-Migrations启用数据库迁移功能
然后将Employee的类定义,把原来注释掉的Location属性行,去掉注释(即:增加了Location属性)
回到PM控制台,输入Add-Migration First 生成相应的db修改脚本
最后输入Update-Database更新表结构
打开Server Explorer视图,查看下Employees表
可以发现,已经增加了新字段Location
- Storm读取Kafka数据是如何实现的
- faster-rcnn在编译时遇到的一些问题
- 使用感知机训练加法模型
- 让你真正理解什么是SparkContext, SQLContext 和HiveContext
- 谈谈Go语言的反射三定律
- centos6.x升级protobuf操作流程.
- java调用c++函数的简单笔记
- 数据挖掘之聚类算法Apriori总结
- 数据挖掘之聚类算法K-Means总结
- mxnet运行时遇到问题及解决方法
- 【算法】朴素贝叶斯分类算法原理与实践
- 深度学习之图像的数据增强
- 《GO并发编程实战》—— 原子操作
- Golang语言社区--wesocket的demo(包括H5前端,GO后端)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 运算符
- ViewPager实现带引导小圆点与自动跳转的引导界面
- Android开发中Launcher3常见默认配置修改方法总结
- Android辅助功能实现自动抢红包(附源码)
- Android设置控件阴影的三种方法
- Android Studio 引入 aidl 文件的方法汇总
- Android 点击生成二维码功能实现代码
- Android屏幕手势检测的实现代码
- Android开发实现简单的观察者与被观察者示例
- Android开发中4个常用的工具类【Toast、SharedPreferences、网络及屏幕操作】
- Android实现客户端语音动弹界面实例代码
- Android封装MVP实现登录注册功能
- Android5.1系统通过包名给应用开放系统权限的方法
- android 上传aar到私有maven服务器的示例
- Android Studio开发环境搭建教程详解