去年寫過一篇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
文章列表