《Entity Framework 6 Recipes》翻譯系列 (3) -----第二章 實體數據建模基礎之建立一個簡單的模型

第二章 實體數據建模基礎

  頗有可能,你纔開始探索實體框架,你可能會問「咱們怎麼開始?」,若是你真是這樣的話,那麼本章就是一個很好的開始。若是不是,你已經建模,並在實體分裂和繼承方面感受良好,那麼你能夠跳過本章。數據庫

  本章將帶你漫遊使用實體框架建模的基本實例,建模是實體框架的核心特性,同時也是區別實體框架和微軟早期的數據訪問平臺的特性。一旦建好模,你就能夠面向模型編寫代碼,而不用面向關係數據庫中的行和列。架構

  本章以建立一個簡單概念模型的實例開始,而後讓實體框架建立底層的數據庫,剩下的實例,將向你展現,如何經過數據庫中已存在的表以及它們之間的關係來建模。框架

2-1 建立一個簡單模型

  問題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/

相關文章
相關標籤/搜索