我最近幾天正在學習Entity Framework Code First.我打算分享一系列的學習筆記,今天是第一部分: 為什麼要使用Code First: 近年來,隨著domain driven design的推廣,以前那種先建好資料庫,然後再編寫代碼的方式受到了越來越多的質疑。因為使用這種開發方式 ...
我最近幾天正在學習Entity Framework Code First.我打算分享一系列的學習筆記,今天是第一部分:
為什麼要使用Code First:
近年來,隨著domain driven design的推廣,以前那種先建好資料庫,然後再編寫代碼的方式受到了越來越多的質疑。因為使用這種開發方式很難適應領域內業務邏輯的改變,它需要當每次領域發生改變的時候,先改變資料庫,然後再改變業務邏輯和實體的代碼,開發周期比較長,而且不利於單元測試。所以隨著domain driven design一同推廣的還有Persistence Ignorance 原則和POCO(Plain Old CLR Object). Persistence Ignorance principle說白了就是把domain driven design中的實體,值對象,服務與數據存儲功能完全隔離,使他們不摻雜任何與數據存儲相關的代碼。在隨後的實例中,大家可以看到如何通過Code First實現這些。
所謂的Code First就是先寫業務邏輯部分的代碼,實現domain driven design當中的實體,值類型和服務,然後通過Code First預設的習慣或者配置把他們映射到資料庫中去。這樣做一方面可以讓我們先把全部的精力投放到業務邏輯的設計和實現中,並且可以在實現業務邏輯後,使用一些Mock工具單獨對業務邏輯代碼進行測試。另一方面,當我們對業務邏輯進行proof-of-concept時,可以通過幾個簡單的界面就可以做出prototype去給客戶演示了。通過使用Code First方式,使我們能更快的對應業務邏輯的改變和原型搭建。所以Code First非常適用於使用domain driven design的新建項目使用。
關於使用Code First的好處以及使用它的場合,相信通過前面的介紹大家已經清楚了,還是讓我們回到代碼,通過最簡單的一個實常式序看看Code First是怎麼按照他的約定來實現資料庫的映射的。
Code First遵循的是Convention over Configuration的原則,也就是說如果你對領域中的各類對象的映射沒有進行配置的話, Code First就會按照他的預設習慣進行領域對象與資料庫的映射。
我在本系類的日記中使用的實例是給公司內部新員工培訓使用的一個簡單的訂單管理系統,包含客戶,訂單,訂單條目,產品,產品目錄等實體和值對象。
讓我們先考慮最簡單的產品目錄吧,假設我們的產品目錄是一個值對象包含以下屬性:
public class ProductCatalog
{
public int ProductCatalogId { get; set; }
public string CatalogName { get; set; }
public string Manufactory { get; set; }
public decimal ListPrice { get; set; }
public decimal NetPrice { get; set; }
}
怎麼才能夠讓Entity Framework認識你定義的值對象並且把它映射成資料庫中的表呢?你需要定義一個繼承DbContext類的子類,然後在這個子類中添加一個泛型DbSet的屬性,類型參數就是你自定義的ProductCatalog類。
public class OrderSystemContext:DbContext
{
public DbSet<ProductCatalog> ProductCatalogs { get; set; }
}
然後你可以使用你定義的OrderSystemContext類進行數據操作了。
var context = new OrderSystemContext();
var catalogs = context.Catalogs.Where(c => c.ProductCatalogId == 1);
現在就讓我們來介紹一下Entity Framework Code First中的映射習慣吧。
1. 資料庫映射:Code First 預設會在本地的SQL Expression資料庫中建立一個和DbContext的子類的全名相同的資料庫,全名指的是命名空間加上類名。當然後邊會介紹怎麼進行配置。
2.表映射:Code First 預設會按照類型名複數建立數據表,比如說ProductCatalog類對應的表名就叫ProductCatalogs.後邊會介紹如何改變預設的表名。
3.列映射:Code First 預設會按照類中的屬性名建立column,它還有預設的數據類型映射習慣,int會映射為interger,string會映射為nvarchar(max),decimal會映射為decimal(18,2)。後邊會介紹如何更改column的名稱,類型以及其他特性。
4.主鍵映射:Code First 預設會在類的屬性中需找名字為Id或類型名稱+Id的int類型的屬性作為主鍵,並且是自增欄位。這些也是可以改的。
這個程式執行完之後就會在預設的SQL Expression中建立一個名為xxx.OrderSystemContext的類,並且建立一個名字為ProductCatalogs的表,表的具體結構如下:
當然,我們既然使用domain driven design就完全應該按照我們領域中的實際業務情況設計我們的類,這樣就不可能使我們的類完全遵守Code First的習慣,接下來的學習日記將主要具體介紹如何通過Code First的配置功能將我們領域中各種各樣的類和類之間的關係映射到資料庫中。
參考頁面:http://qingqingquege.cnblogs.com/p/5933752.html