前言:學習了EF框架這么久,還沒有好好總結一番,正好遇到一國外的網站,發現不錯,隨即翻譯過來,一是讓自己復習一遍,二是供廣大初學者學習,翻譯過程中加入了一些自己的理解,如有錯誤,還請指出,多謝多謝。好了,進入正題
EF框架有三種設計模式:Code-First、Model-First、Database-First,本篇討論Code-First
(EF6已開源,網址:http://entityframework.codeplex.com/)
-
什么是Code-First?
Entity Framework 從EF4.1開始包含Code-First模式,Code-First主要用在Domain Driven Design(領域驅動設計)中。在Code-First模式中,我們針對每一個功能要求創建一個模型類(Domain Class),把關注點放在一個領域里,Code-Fiist 將會根據我們的模型類和配置自動創建數據庫。
當我們程序運行的時候,Code-First會創建一個新的數據庫(如果不存在),並根據默認約束把模型類映射到數據庫表里,一個類對應一張表,我們可以使用DataAnnotation或者fluent API配置模型類來重寫默認約定。先別急,后面會一一介紹。
所以Code-First設計的工作流程應該是:
編寫模型類和context類→配置映射要求→運行程序→創建新的數據庫或者用模型類映射已存在的數據庫→錄入測試數據→發布最終應用程序
-
環境配置
開發環境及工具:
- .NET Framework 4.5
- Visual Studio 2013
- MS SQL Server 2008/2012 Express
用Nuget安裝EF,在解決方案上右鍵,選中NuGet
搜索EntityFramework
點擊安裝
安裝完成后,在我們項目引用里面就有了EntityFramework的程序集,我們點右鍵屬性,發現版本是6.0
這樣,EF環境就搭好了。
-
一個簡單的事例
假定我們為某學校創建一個應用程序,那么這個程序應該能夠添加或修改學生信息、年級信息、教師信息和課程信息。
讓我們先忘記數據庫設計,我們先來為“學校”這個領域創建各種類,首先,我們創建兩個簡單的類,Student和Standard,這里,每個Student里面又包含了一個Standard類。
public class Student { public Student() { } public int StudentID { get; set; } public string StudentName { get; set; } public DateTime? DateOfBirth { get; set; } public byte[] Photo { get; set; } public decimal Height { get; set; } public float Weight { get; set; } public Standard Standard { get; set; } }
這個Standard(年級類)應該包含了多個Student,一個班上肯定有很多不同的學生,所以這是“one-to-many”(一對多)的關系。
public class Standard { public Standard() { } public int StandardId { get; set; } public string StandardName { get; set; } public ICollection<Student> Students { get; set; } } }
模型類寫好了,我們就要開始寫DbContext,下面我們創建一個SchoolContext類,繼承於DbContext,並且以我們剛剛創建的兩個模型類為泛型,顯示定義的兩個DbSet<T>屬性,屬性名約定為復數形式(約定大於配置,在ASP.NET中這是很重要的一個設計理念)。注意,每一個模型類,都必須在DbContext中定義一個與之對應的DbSet<T>屬性,代碼如下:
namespace EF_Code_First_Tutorials { public class SchoolContext: DbContext { public SchoolContext(): base() { } public DbSet<Student> Students { get; set; } public DbSet<Standard> Standards { get; set; } } }
現在,我們可以在主程序里實例化一個SchoolContext,然后添加學生信息了。
class Program { static void Main(string[] args) { using (var ctx = new SchoolContext()) { Student stud = new Student() { StudentName = "New Student" }; ctx.Students.Add(stud); ctx.SaveChanges(); } } }
如果我們運行程序,就會插入一條學生信息到數據庫里。
到這里你肯定很奇怪,數據庫在哪兒?表是什么樣?表中各列又是什么樣?別急,讓我們打開數據庫一探究竟。
這就是Code-First模式神奇的地方,它會自動幫我們創建數據庫,並且以傳入DbContext的構造函數中的參數來命名創建的數據庫,因為上面實例化SchoolContext我們並沒有傳任何參數進去,所以它默認會以"項目名稱.Context名"來命名數據庫。如你所見,數據庫里已經根據我們上面寫的兩個模型類創建了兩張表,表的各個列就是類的各個屬性。
注意:StudentId和StandardId自動設置為主鍵,Students表里自動創建了一個Standard_StandardId的外鍵,這是因為Student類里有一個Standerd類的屬性,你肯定疑問怎樣定義外鍵名,那下篇我們就來介紹Code-First約定。