一個業務領域由各個實體和各個相互關聯且有格子的屬性和行爲的實體組成,每個實體都有其狀態和驗證規則需要維護,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