Entity Framework Code First 學習日記(1)

来源:http://www.cnblogs.com/libing1/archive/2017/02/23/6431623.html
-Advertisement-
Play Games

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

 

image

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

參考頁面:http://qingqingquege.cnblogs.com/p/5933752.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Redis目前對事物的支持相對簡單。Redis只能保證一個client發起的事務中的命令可以連續的執行,而中間不會插入其他的client命令。當一個client在一個鏈接中發出multi命令時,這個鏈接會進入一個事務上下文,該連接後續的命令不會立即執行,而是先放到一個隊列中,當執行exec命令時,r... ...
  • ........ http://blog.csdn.net/se7en_q/article/details/47258007 ...
  • Redis的複製功能是支持多個資料庫之間的數據同步。一類是主資料庫(master)一類是從資料庫(slave),主資料庫可以進行讀寫操作,當發生寫操作的時候自動將數據同步到從資料庫,而從資料庫一般是只讀的,並接收主資料庫同步過來的數據,一個主資料庫可以有多個從資料庫,而一個從資料庫只能有一個主資料庫... ...
  • Redis速度很快,所以在一臺比較好的服務起下,一個外部的用戶可以在1秒鐘進行150k次的密碼嘗試連接,所以我們需要設置非常強大的密碼來防止暴力破解。 ...
  • create database 資料庫名; 創建一個資料庫即可解決,具體原因還未知 ...
  • String是最簡單的類型,一個key對應一個Value,string類型是二進位安全的。redis的string可以包含任何數據類型,比如jpg圖片或者序列化的對象。 Redis hash 是一個string類型的filed和value的映射表、它的添加、刪除操作都是0、1(平均操作)。Hash特... ...
  • SQLServer資料庫的基礎知識的回顧: 1)主數據文件:*.mdf 2)次要數據文件:*.ndf 3)日誌文件:*.ldf 每個資料庫至少要包含兩個文件:一個數據文件和一個日誌文件 如何查看SQL Server的幫助 快捷鍵F1 一、創建文件夾 exec sp_configure 'show a ...
  • DbContext、DbSet及DbQuery是Entity Framework Code First引入的3個新的類,其中DbContext用於保持資料庫會話連接,實體變化跟蹤及保存,DbSet用於暫存實體類的變化跟蹤,DbQuery用於提供查詢跟你。 1、使用Set查詢全部記錄 使用DbCont ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...