任何一個和數據相關的系統里,數據持久化都是一個不容忽視的問題。 一直以來,Java 平臺出了很多 NB 的 ORM 框架,Hibernate、MyBatis等等。.NET 平臺上,ORM 框架這一塊一直沒有一個能吊到讓幾乎所有開發人員改掉以拼寫 SQL 語句訪問資料庫的習慣。 實際上,在 .NET ...
任何一個和數據相關的系統里,數據持久化都是一個不容忽視的問題。
一直以來,Java 平臺出了很多 NB 的 ORM 框架,Hibernate、MyBatis等等。.NET 平臺上,ORM 框架這一塊一直沒有一個能吊到讓幾乎所有開發人員改掉以拼寫 SQL 語句訪問資料庫的習慣。
實際上,在 .NET 平臺上,也層出不窮的出現了很多類似的玩意兒,比如Nhibernate、Ibatis,還有微軟的親兒子——坑爹的 LinqToSQL。雖然這麼多框架,但是真的沒見過 .NET 平臺的 ORM 框架能像 Java 里那樣普及。
所幸,微軟又搞出來一個兒子——EntityFramework。前幾個版本沒用過,前幾天直接瞭解了6.1.3版本的。。感覺,真 TMD 好用。。
鑒於網上的所有教程都太教條式,入門時看起來很坑爹,所以將這篇心得做為隨筆,供大家共同學習探討。
一、安裝框架
首先,要添加環境。右鍵項目,可以在 NuGet 里直接安裝。如下圖:
安裝完成以後,項目引用里新增了兩個關於EntityFramework的引用,如下圖:
到此,環境就配置好了。
二、創建Context類和模型類
0,準備資料庫。
寫代碼之前,我們得先有一個測試資料庫,和一個測試表。
這裡我使用 SQLServer,表結構如下:
EF的使用有三種模式:Model First、DataBase First 和 Code First。這幾種First什麼區別,沒仔細研究。不過我這裡使用的好像是 Code First 構建的項目。這種方式,我只是覺得方便,好用,感覺項目更乾凈,不用添加亂七八糟的代碼和配置。
1,添加模型類。
EF 里的模型類和普通的類一樣,無非是為類或屬性添加一些屬性標記對錶的關係進行一些映射罷了。如下:
[Table("Users")] public class UserInfo { [Key] [StringLength(20)] [Column("Code")] public string Code { get; set; } [StringLength(20)] public string Name { get; set; } }
上面代碼中,定義了以下幾個關鍵信息:
1,類 UserInfo 對應資料庫里的 Users 表。
2,Code 屬性對應資料庫里的 Code 欄位(如果屬性名和欄位名相同,可以忽略這個配置,比如 Name 屬性)。
3,並且指明兩個字元型屬性的長度不能超過20個字元。
4,指示 Code 屬性所對應的列是主鍵列。
(註:Table、Key、StringLength、Column 這幾個類需要引用命名空間 System.ComponentModel.DataAnnotations 和 using System.ComponentModel.DataAnnotations.Schema )
2,添加 DbContext 類。
DbContext 類是 EF 的核心,封裝了所有數據存取業務相關的邏輯。不管是增刪改查還是事務什麼什麼,所有的資料庫操作的業務都可以在這裡搞定。。聽起來很牛逼!
聽起來很牛逼,事實上更牛逼!
雖然很牛逼,但是用起來超級簡單。比如像下麵的代碼,就實現了一個簡單的 DbContext 類:
public class DALContext : DbContext { public DALContext() : base("name=DALContext") { } public virtual DbSet<UserInfo> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { } }
寥寥幾行,完成了複雜的 DB 操作。
上面代碼簡單說明一下:
1,這個類名自己起,想叫啥叫啥,我這裡叫 DALContext。
2,這個類必需繼承 DbContext 類。
3,在構造方法里,調用父類的構造方法,指明如何連接資料庫,這裡可以是連接字元串,也可以是配置文件里配置的連接名稱(連接名稱必需首碼 name= )。
4,virtual 聲明的 DbSet<T> 類型的屬性里封裝了一大堆數據操作的業務邏輯,我們只需要操作該屬性就行了。
5,有幾個表,就聲明幾個 DbSet<T> 類型的屬性就行了。T 是前面代碼中聲明的 Model ,屬性名自己隨便起。
6,OnModelCreating 方法有什麼用?具體的我也不知道。
(這個類要引用命名空間 System.Data.Entity)
3,配置連接字元串
打開配置文件,添加一個名為 DALContext 的連接字元串配置。如下圖:
(打開配置文件我們會發現,裡面多了一些關於 entityFramework 的奇怪的東西。至於是不是必要的,刪了會不會死人,我也不知道)
至此,資料庫表的映射就Ok了。
三、編寫測試代碼
廢話不說,上代碼:
static void Main(string[] args) { using (DALContext db = new DALContext()) { try { db.Users.Add(new UserInfo() { Code = DateTime.Now.Ticks.ToString(), Name = "張三" }); IEnumerable<UserInfo> users = db.Users.Where<UserInfo>(u => u.Name == "張三"); foreach(var u in users) { Console.WriteLine(string.Format("{0} - {1}",u.Code,u.Name)); } db.SaveChanges(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } Console.WriteLine("Press any key to exit"); Console.ReadKey(); }
在 Main 方法里,我們聲明瞭一個 DALContext 對象 db,為了便於對象資源的釋放,這裡使用 using 將其包起來。
這段代碼實現了以下功能:
1,訪問 db 對象 的 Users 屬性,使用 Add 方法像操作一個集合一樣向資料庫表裡增加一條記錄。
2,訪問 db 對象 的 Users 屬性,使用 Where 方法根據條件查詢一批數據對象,保存在變數 users 里,並迴圈輸出到控制台。
3,使用 db 對象的 SaveChanges 方法,將對資料庫的變更提交。
運行以後,結果如下:
上面例子實現了增加和查詢功能,刪除和修改功能類似於操作集合,只要保證最後調用 SaveChanges 方法將修改提交就行。