去年写过一篇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的项目
项目的References引用节点右击,选择Manage NuGet Packages...
参考下图,搜索Oracle,安装图中的二项:
安装过程中,会弹出License对话框,点击I Accept
安装成功后,这二项应该会自动打上绿勾
安装完成后,会自动打开readme.txt,地球人一般都不看这玩意儿
再看下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