Entity Framework Code First 學習日記(1)


我最近幾天正在學習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的表,表的具體結構如下:

 

image

當然,我們既然使用domain driven design就完全應該按照我們領域中的實際業務情況設計我們的類,這樣就不可能使我們的類完全遵守Code First的習慣,接下來的學習日記將主要具體介紹如何通過Code First的配置功能將我們領域中各種各樣的類和類之間的關系映射到數據庫中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM