一個業務領域由各個實體和各個相互關聯且有格子的屬性和行爲的實體組成,每一個實體都有其狀態和驗證規則須要維護,Entity Framework (後面簡稱EF)實體框架設計的出現是爲了容許開發人員着重關注業務領域,開發人員就實體來建模。它產生的目的是爲了解決企業快速開發和迭代出市場所須要的系統或者軟件。下面咱們介紹Entity Framework 中的三種領域建模方式。數據庫
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來處理,包括建立數據庫表以及表與表之間的關係;ide
4)、這種方式能夠通俗易懂的成爲代碼定義數據庫,因此不推薦對數據庫的手動修改;測試
5)、咱們可使用它來映射表結構到一個已存在的數據庫。spa
栗子:VS2017 --->新建一個MVC項目--->右擊項目引用--->管理NeGet程序包--->瀏覽搜索EntityFramework--->安裝設計
而後在Models中添加兩個類 Student和Class 表示學生表與班級表3d
創建一個數據庫上下文類 配置數據庫連接字符串 在Home控制器裏面測試看看 code
<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(); }
運行起來看數據庫裏面
它就生成了對應的數據庫,是複數的形式,也能夠本身代碼配置命名。後面幾章會說。
Model First 容許咱們使用實體設計器在空模型(擴展名.edmx)中建模型實體及其關係個繼承層次結構,而後建立數據庫。在Model First 方法中,建立實體模型是必須選擇「空模型」,而不是從數據庫生成。其優缺點以下:
1)、若是你喜歡可視化應用程序中的數據結構,或者不喜歡編寫SQL,那麼它將被你喜歡,由於它會自動生成;
2)、在此方法中,咱們沒法控制實體和數據庫,由於自動生成的代碼難以修改,因此這種建模方式已經愈來愈不被開發者使用。但對於小型簡單的項目它行之有效;
3)、要在POCO是體重添加額外的功能,咱們不得不修改T4模板或者使用部分類來完成;
4)、數據庫模型的更改不是最佳選擇,是由模板定義了數據庫。
栗子在Models文件夾上 右鍵-->新建-->新建項-->數據-->ADO.NET實體數據模型,選擇空模型,個人命名默認Model1沒改而後點擊完成
右擊新增長-->實體
而後添加變量
數據類型本身設置F4,右擊表添加關聯
而後右擊空白根據模型生成數據庫就用剛剛的SqlConn連接,在連接字符包含敏感字符選上 後面會生成一個SQL文件 右擊執行(Ececute)填鏈接字符串。鏈接就能夠了
Database First 使咱們可以從現有數據庫(Sql Server 、Oracle、DB2等)建立模型,此方法減小了自動生成代碼所編寫的代碼量,同時也限制了使用生成代碼的結構。優缺點以下:
1)、若是咱們已有BDA設計的數據庫來單獨開發或現有已經存在的數據庫,那麼它將會做爲首選;
2)、經過EDM嚮導爲咱們建立實體、關係和繼承層次結構,修改映射以後還能夠生成POCO實體;
3)、要在POCO實體中添加額外的功能,必須經過T4修改模板或者使用部分類;
4)、數據庫的手動更改變爲可能,由於數據庫定義了領域模型 ,若是要修改數據庫表結構,只須要從數據庫更新實體模型便可。
栗子在Models文件夾上 右鍵-->新建-->新建項-->數據-->ADO.NET實體數據模型,選擇來自數據庫的ef設計器,個人命名默認。選擇表,視圖,存儲過程的 看本身須要。能夠看到生成出來的直接替換了剛剛Model First