Entity Framework 實體資料模型——Code First
之前大致總結了下EF 設計器的概念和實戰操作,接下來來總結下 Code First 構建的實體資料模型。
EF 設計器建立實體資料模型檔案(.emdx)整合 Entity Framework,並通過 DBContext 和 DbSet 類來實現支援資料庫功能的開發,
然而實體資料模型的構建與維護並不容易,難以應付開發大型的商業應用所需。因此,Entity Framework 在後續版本推出了Code First
開發模式,以相對簡單明瞭的類設計取代了EF 設計器構建的實體資料模型檔案(.emdx)。
一、傳統資料類物件
Code First 通過典型的傳統類物件(Plain Old ClassObject,POCO)對映到資料結構,簡化了 EF 的開發過程,開發人員
只需建立DbContext 和 DbSet 繼承的物件,EF 會自動處理其中的轉換細節。與 EF 設計器 相比,Code First 只保留了原來
edmx實體資料模型檔案中的 DBContext、DbSet派生檔案。
無論是從資料庫生成模型,還是從模型建立資料庫,EF 一旦確認DbSet 物件屬性與數字表欄位結構間的對映正確,便會自動
維護資料查詢變動等的相關操作。
二、建立專案
建立一個控制檯應用程式的專案,專案名稱為:CodeFirstProject
然後選擇專案 ==> 單擊滑鼠右鍵 ==> 選擇 管理NuGet程式包 ==> 選擇 瀏覽 頁籤 ==> 在搜尋框輸入回車搜尋 ==> 點選 安裝
動態圖在這兒:
接著在專案中新增一個名為 Model 的資料夾,並在該資料夾中新增兩個類檔案:Student.cs 和 StudentInfoModel.cs 。
Student 類中定義以下屬性:
public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public boolSex { get; set; } public string Hobby { get; set; } public DateTime Birthday { get; set; } public decimal Tuition { get; set; } }
StudentInfoModel 類需要繼承 DbContext,並定義 Students 屬性:
using System.Data.Entity; namespace CodeFirstProject.Model { public class StudentInfoModel : DbContext //繼承了 DbContext { public DbSet<Student> Students { get; set; } } }
接下來,我們需要在Main 方法中例項化StudentInfoModel,並獲取 Students 屬性的總數:
using CodeFirstProject.Model; using System; using System.Linq; namespace CodeFirstProject { class Program { static void Main(string[] args) { StudentInfoModel stuModel = new StudentInfoModel(); int stuCount = stuModel.Students.Count(); Console.WriteLine(stuCount); Console.Read(); } } }
第一次執行程式時,SQL Express 會自動建立名為CodeFirstProject.Model.StudentInfoModel 的資料庫,
並建立了 Student 表,結構由 Student 類檔案中配置的屬性決定。我們可以通過 "SQL Server 物件資源管理器"(可在 檢視 選單下找到)
來檢視程式自動生成的資料庫:
我們可以通過檢視資料庫的屬性,來找到程式建立的資料庫所在的目錄:
選中資料庫 ==> 單擊滑鼠右鍵 ==> 屬性
資料庫連線:
如果不在StudentInfoModel 類中指定資料庫的連線資訊,SQL Express 將會建立所需的資料庫。
而在實際開發中,通常我們會通過連線字串的設定來自行建立所需的資料庫。
首先,我們需要在StudentInfoModel 類中新增一個建構函式,並配置資料庫的連線名稱:
using System.Data.Entity; namespace CodeFirstProject.Model { public class StudentInfoModel : DbContext { public StudentInfoModel() : base("name=StuInfoModelConnection") //新增建構函式,並配置資料庫的連線名稱 { } public DbSet<Student> Students { get; set; } } }
其次開啟App.config 檔案,在configuration 節點中新增如下內容:
<connectionStrings> <!--DataDirectory 表示資料庫路徑的替換字串。--> <add name="StuInfoModelConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;
AttachDbFilename=|DataDirectory|CodeFirstProjectModel.mdf; Integrated Security=True;Connect Timeout=30;
MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient"/> </connectionStrings>
第三步,在專案的 \bin\Debug 目錄下建立資料庫檔案:
特別注意:App.config 中配置的資料庫名稱,需要和建立時的資料庫名稱保持一致哦!!!
最後,可以通過新增現有項的方式,把資料庫拷貝到專案的根目錄:
App.config 檔案的連線配置也要相應的調整下,才能使用根目錄中的資料庫檔案喲!
<connectionStrings> <!--將 AttachDbFilename=|DataDirectory|CodeFirstProjectModel.mdf; 這個配置替換成
Initial Catalog=CodeFirstProjectModel; 這個就好了!--> <add name="StuInfoModelConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB; Initial Catalog=CodeFirstProjectModel; Integrated Security=True;Connect Timeout=30;
MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient"/> </connectionStrings>
好了,在空白專案中使用 Code First 建立程式, EF 會自動完成其中與資料庫的互動細節。
與 EF 設計器相比,Code First 直接採用類取代 EMD 檔案,內容更為簡潔,而實體類與資料庫
底層資料結構的對映設定由慣例原則、屬性標記以及 Fluent API 等程式設定的方式來取代 XML
格式的 SSDL、CSDL與MSL設定。