頗有可能,你纔開始探索實體框架,你可能會問「咱們怎麼開始?」,若是你真是這樣的話,那麼本章就是一個很好的開始。若是不是,你已經建模,並在實體分裂和繼承方面感受良好,那麼你能夠跳過本章。數據庫
本章將帶你漫遊使用實體框架建模的基本實例,建模是實體框架的核心特性,同時也是區別實體框架和微軟早期的數據訪問平臺的特性。一旦建好模,你就能夠面向模型編寫代碼,而不用面向關係數據庫中的行和列。架構
本章以建立一個簡單概念模型的實例開始,而後讓實體框架建立底層的數據庫,剩下的實例,將向你展現,如何經過數據庫中已存在的表以及它們之間的關係來建模。框架
問題ide
你有一個嶄新的項目,須要建立一個模型。工具
解決方案spa
咱們設想你須要建立一個管理,人員姓名、電話號碼的應用程序。爲了保持儘量的簡單,咱們假設你只須要一個實體類型:Person。翻譯
按如下步驟來建立模型:設計
1.右鍵你的項目,而後選擇➤New Item(新建項)。3d
2.從模板中選擇 ADO.NET Entity Data Model(ADO.NET實體數據模型),而後點擊Add(增長)。該模板在Visual C#條目下面的Data項下面。(如圖2-1)。code
圖2-1 增長一個新的.emdx文件,其中包含使用XML描述的概念模型、存儲模型、映射層
3.在嚮導第一步選擇Empty Model(空模型)並點擊Finish(完成)按鈕。嚮導將建立一個新的設計器界面上爲空的概念模型。
4.右鍵設計器界面,選擇增長➤Entity(實體)。
5.在Entity Name(實體名稱)字段鍵入Person,選中Create a Key Propety(建立實體鍵)複選框,使用Id做爲實體鍵並確保其類型爲Int32.點擊OK按鈕,一個新的Person實體便出如今設計器窗口中(如圖2-2)。
圖2-2在概念模型中添加一個表明Person的實體類
6.右鍵Person實體頂部,而後選擇Add(添加) ➤Scalar Property(標量屬性)。一個新的標量屬性便添加到了Person實體中。
7.將增長的標量屬性重命名爲Firstname.而後繼續添加標量屬性LastName、MiddleName和PhoneNumber.
8.右鍵Id屬性並選擇Properties(屬性),在屬性窗口中,若是StoreGneneratedPattern屬性值未設置爲Identity時,將其設置爲Identity。該標識是指Id屬性的值將由存儲層(數據庫)計算產生。最終獲得的數據庫腳本會標識Id列爲identity列,存儲邏輯模型也會知道,數據庫將會自動管理該列的值。
完成後的概念模型如圖2-3所示。
圖2-3 模型包含一個表明Person的實體類型
你已經完成了一個簡單的概念模型。不過從該模型生成數據庫,還有一些工做要作:
9.須要更改咱們模型的一些屬性,以幫助咱們生成數據庫。右鍵計設器窗口,選擇properties(屬性)。更改數據庫架構名稱(Database Schema name)爲Chapter2,更改實體容器名稱(Entity Container Name)爲EF6RecipesContext。如圖2-4所示。
圖2-4 更改模型屬性
10.右鍵設計器窗口並選擇Generate Database Script from Model(根據模型生成數據庫)。選擇一個已存在的數據庫鏈接或者新建一個鏈接。圖2-5,咱們選擇建立一個新的本地數據庫EF6Recipes的鏈接。
圖2-5建立一個實體框架從概念模型建立數據庫腳本要使用的數據庫鏈接
11.單擊OK按鈕完成鏈接屬性設置,而後單擊Next(下一步)預覽數據庫腳本(如圖2-6)。一旦點擊Finish(完成),生成的腳本就被添加到你的項目中。
圖2-6 在.edmx文件中生成存儲邏輯模型並建立數據庫腳本
12.在SSMS(SQL Server Management Studio)查詢窗口中執行上面生成的數據庫腳本建立數據庫和People表。
原理
實體框架設計器是一個建立概念模型、存儲模型和映射層的強有力工具。它提供雙向建模的功能,你能夠從一個空白的模型設計窗口建模,也可經過導入一個已存在的數據庫來建立概念模型、存儲模型和映射層。當前版本提供了有限的雙向建模功能,它容許從模型從新建立數據庫,根據數據庫的改變來更新模型。
概念模型擁有不少影響生成存儲邏輯模型和數據庫腳本的屬性,咱們更改了其中的兩個屬性,第一個是容器的名稱,他是繼承至DbContext上下文對象。咱們給它命名爲EF6RecipesContext,它與本書使用的上下文對象保持一致。
另外一個是,更改了表示生成存儲邏輯模型和數據庫腳本的架構名稱爲「Chaper2」。
代碼清單2-1演示了,咱們建立和插入Person實體類型的實例,並將全部Person實體保存到數據庫。
代碼清單2-1. 從模型中插入和獲取數據
1 using (var context = new EF6RecipesContext()) { 2 var person = new Person { 3 FirstName = "Robert", 4 MiddleName = "Allen", 5 LastName = "Doe", 6 PhoneNumber = "867-5309" 7 }; 8 context.People.Add(person); 9 person = new Person { 10 FirstName = "John", 11 MiddleName = "K.", 12 LastName = "Smith", 13 PhoneNumber = "824-3031" 14 }; 15 context.People.Add(person); 16 person = new Person { 17 FirstName = "Billy", 18 MiddleName = "Albert", 19 LastName = "Minor", 20 PhoneNumber = "907-2212" 21 }; 22 context.People.Add(person); 23 person = new Person { 24 FirstName = "Kathy", 25 MiddleName = "Anne", 26 LastName = "Ryan", 27 PhoneNumber = "722-0038" 28 }; 29 context.People.Add(person); 30 context.SaveChanges(); 31 } 32 using (var context = new EF6RecipesContext()) { 33 foreach (var person in context.People) { 34 System.Console.WriteLine("{0} {1} {2}, Phone: {3}", 35 person.FirstName, person.MiddleName, 36 person.LastName, person.PhoneNumber); 37 } 38 }
代碼清單2-1的輸出爲:
John K. Smith, Phone: 824-3031
Robert Allen Doe, Phone: 867-5309
Kathy Anne Ryan, Phone: 722-0038
Billy Albert Minor, Phone: 907-2212
最佳實踐
當建立一個上下文實例時,咱們使用using()語句:
using (var context = new EF6RecipesContext())
{
...
}
若是你不熟悉這種模式,也不要緊,由於它很簡單。通常狀況下,咱們經過new操做符並將結果賦值給變量來獲得一個對象的實例,當這個變量超出其生命週期,該對象再也不被別的任何對象引用。垃圾回收器會在某一個時間點開始釋放該對象所佔的內存工做。 對於咱們.NET應用程序中的大多數對象來講,這是一個巨大的工做,由於他們會一直佔用着資源,直到垃圾回收器開始工做。而垃圾回收器具備不肯定性,由於他老是按本身的計劃來完成其工做,對此我能施加的影響頗有限。
DbContext上下文對象的實例佔用着像數據庫鏈接這樣的,咱們但願不使用時就當即釋放的系統資源。咱們真的不但願數據庫鏈接的釋放工做要等到垃圾回收器來完成。
using()語句有很好的特性。首先,當代碼執行完using(){}代碼塊時,上下文中的Dispose()方法會被自動調用。由於DbContext上下文實現了IDisposable接口,該方法將關閉全部數據庫鏈接,清理任何須要被釋放的資源。
其次,無論怎樣,只要代碼離開using(){}代碼塊,方法Dispose()就會被調用。最重要的是,代碼塊裏即便遇到return語句或者是拋出了異常,它都能保證資源獲得合理的釋放。
這裏的最佳實踐是,當建立DbContext上下文對象時老是使用using(){}代碼塊,它將進一步幫助你建立健壯的代碼。
本篇就到這裏吧,若是有翻譯不當的地方,懇請指正。若是你以爲本系值得與更多人分享,那麼請點擊右下角的推薦。謝謝。本文由VolcanoCloud翻譯,轉載請註明出處。謝謝!
實體框架交流QQ羣: 458326058,歡迎有興趣的朋友加入一塊兒交流
謝謝你們的持續關注,個人博客地址:http://www.cnblogs.com/VolcanoCloud/