一個業務領域由各個實體和各個相互關聯且有格子的屬性和行為的實體組成,每個實體都有其狀態和驗證規則需要維護,Entity Framework (後面簡稱EF)實體框架設計的出現是為了允許開發人員著重關注業務領域,開發人員就實體來建模。它產生的目的是為了解決企業快速開發和迭代出市場所需要的系統或者軟體。下面我們介紹Entity Framework 中的三種領域建模方式。
1、Code First
Code First 可以通過C#或者VB.NET 來描述這些模型,然後通過類來建立資料庫。這些類簡稱POJO(Plian Old CRL Object)。POCO來源於Java的POJO,其中J就是Java,POJO是由馬丁·富勒(Martin Fowler) 和其他人一同提出來的概念以反對在20世紀90年代早期受歡迎的JavaBeans。POJO概念提出的主要目標是顯示域可以被成功建模,而不會帶來與執行環境相關的複雜表(JavaBeans在早期版本中帶來了很多),同時執行環境與域建模完全無關。POJO不能再.NET中使用,因此有了具備POJO相同語義 的POCO。這裡的C指的是(Common Language Runtime,CLR通用語言執行時)中建立的一個簡單物件。EF 4.0之前生成的每個類都是從EntityObject基類繼承而來的,因此帶來了許多特定於EF的複雜性。而從EF 4.0開始,框架引入了POCO資料模型,允許使用不從EntityObject繼承的類。使用Code First 模型可以完全以物件導向的方式來工作而不必擔心資料庫的結構,這種抽象使我們能夠建立更加靈活的應用程式。其優點如下:
1)、這是最受歡迎的領域建模方式,可以允許我們建立一個更富有的邏輯、更靈活的應用程式;
2)、因為沒有自動生成的程式碼是難以修改的,所以它提供了我們對程式碼的 完全控制;
3)、通過這種方法我們只需要定義對映,其餘一切交給EF來處理,包括建立資料庫表以及表與表之間的關係;
4)、這種方式可以通俗易懂的成為程式碼定義資料庫,所以不推薦對資料庫的手動修改;
5)、我們可以使用它來對映表結構到一個已存在的資料庫。
栗子:VS2017 --->新建一個MVC專案--->右擊專案引用--->管理NeGet程式包--->瀏覽搜尋EntityFramework--->安裝
然後在Models中新增兩個類 Student和Class 表示學生表與班級表
建立一個資料庫上下文類 配置資料庫連結字串 在Home控制器裡面測試看看
<connectionStrings> <add name="SqlConn" connectionString="Data Source=地址;Initial Catalog=BaseTestEF;User ID=sa; Password=密碼;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> </connectionStrings
using System.Linq; using System.Web; namespace EF3Class.Models { public class WYDB :DbContext { public WYDB() : base("SqlConn") { //預設的初始化器。這種初始化器在第一次執行程式時會建立資料庫,再次執行不會再建立新的資料庫。但是如果我們改變了領域類,執行程式時會丟擲一個異常 //Database.SetInitializer(new CreateDatabaseIfNotExists<DbContextWY>()); //如果領域類發生了改變,刪除以前的資料庫,然後重建一個新的。採用這種初始化器不用再擔心領域類改變影響資料庫架構的問題。 //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextWY>()); //每次執行程式都會刪除以前的資料庫,重建新的資料庫。如果在開發過程中每次都想使用最新的資料庫,那麼可以採用這種初始化器。 Database.SetInitializer(new DropCreateDatabaseAlways<WYDB>()); } public DbSet<Student> Student { get; set; } public DbSet<Class> Class { get; set; } } }
順序別反了,反了想知道啥效果自己測試一下。
public ActionResult Index() { WYDB db = new WYDB(); var c = db.Class.ToList(); var s = db.Student.ToList(); return View(); }
執行起來看資料庫裡面
它就生成了對應的資料庫,是複數的形式,也可以自己程式碼配置命名。後面幾章會說。
2、Model First
Model First 允許我們使用實體設計器在空模型(副檔名.edmx)中建模型實體及其關係個繼承層次結構,然後建立資料庫。在Model First 方法中,建立實體模型是必須選擇“空模型”,而不是從資料庫生成。其優缺點如下:
1)、如果你喜歡視覺化應用程式中的資料結構,或者不喜歡編寫SQL,那麼它將被你喜歡,因為它會自動生成;
2)、在此方法中,我們無法控制實體和資料庫,因為自動生成的程式碼難以修改,所以這種建模方式已經越來越不被開發者使用。但對於小型簡單的專案它行之有效;
3)、要在POCO是體重新增額外的功能,我們不得不修改T4模板或者使用部分類來完成;
4)、資料庫模型的更改不是最佳選擇,是由模板定義了資料庫。
栗子在Models資料夾上 右鍵-->新建-->新建項-->資料-->ADO.NET實體資料模型,選擇空模型,我的命名預設Model1沒改然後點選完成
右擊新增加-->實體
然後新增變數
資料型別自己設定F4,右擊表新增關聯
然後右擊空白根據模型生成資料庫就用剛剛的SqlConn連結,在連結字元包含敏感字元選上 後面會生成一個SQL檔案 右擊執行(Ececute)填連線字串。連線就可以了
3、Database First
Database First 使我們能夠從現有資料庫(Sql Server 、Oracle、DB2等)建立模型,此方法減少了自動生成程式碼所編寫的程式碼量,同時也限制了使用生成程式碼的結構。優缺點如下:
1)、如果我們已有BDA設計的資料庫來單獨開發或現有已經存在的資料庫,那麼它將會作為首選;
2)、通過EDM嚮導為我們建立實體、關係和繼承層次結構,修改對映之後還可以生成POCO實體;
3)、要在POCO實體中新增額外的功能,必須通過T4修改模板或者使用部分類;
4)、資料庫的手動更改變為可能,因為資料庫定義了領域模型 ,如果要修改資料庫表結構,只需要從資料庫更新實體模型即可。
栗子在Models資料夾上 右鍵-->新建-->新建項-->資料-->ADO.NET實體資料模型,選擇來自資料庫的ef設計器,我的命名預設。選擇表,檢視,儲存過程的 看自己需要。可以看到生成出來的直接替換了剛剛Model First