《Entity Framework 6 Recipes》中文翻譯系列 (39) ------ 第七章 使用對象服務之配置模型和使用單複數服務

翻譯的初衷以及爲何選擇《Entity Framework 6 Recipes》來學習,請看本系列開篇 

7-3  配置模型

問題html

  你想了解配置模型中的各類選項。web

解決方案數據庫

  當你添加一個ADO.NET實體數據模型到你的項目中時,實體框架設置.edmx文件的Build Acion屬性爲Entity Deploy。另外,設置元數據項目處理(Metadate Artifact Processing)爲「嵌入輸出程序集中」(Embed in Output Assembly)。當你編譯項目時,Entity Deploy 會從.edmx文件中提取三個部分的內容放到三個不一樣的文件中。CSDL部分被提取到Model.csdl文件,MSL部分被提取到Model.msl文件中,SSDL部分被提取到Model.ssdl文件中。由於「嵌入輸出程序集中"選項,這三個文件會做爲資源嵌入到程序集中。框架

  更改元數據項目處理(Metadate Artifact Processing)爲「複製到輸出目錄」(Copy to Output Directory),會致使model.*這三個文件被複制到程序集的輸出目錄中。它們不會做爲資源被嵌入到程序集中。學習

原理ui

  .edmx文件包含所有三層:概念模型層,映射層和存儲邏輯層。 它還包含設計器用於管理計設窗口的數據。在運行時,實體框架單獨使用每一層。.edmx文件只是一個供設計時使用的便捷容器。模型的配置依賴模型中全部的層,這些層能夠被嵌入程序集,存儲在文件中,也能夠是7-2節中看到的那樣,從別的數據源獲取並完成MetadataWorkspace實例的建立。spa

  若是元數據項目處理(Metadate Artifact Processing)設置爲「嵌入輸出程序集中」(Embed in Output Assembly),你將會看到你的配置文件App.config或者web.config中的鏈接字符串,包含一個metadata標籤,它多是以下的樣子:翻譯

metadata=res://*/Recipe3.csdl|res://*/Recipe3.ssdl|res://*/Recipe3.msl;設計

  這些符號表示,嵌入程序集中的模型層對應的搜索路徑。若是更改元數據項目處理(Metadate Artifact Processing)爲「複製到輸出目錄」(Copy to Output Directory),你會看到鏈接字符串會改變成相似下面的樣子:3d

metadata=.\Recipe3.csdl|.\Recipe3.ssdl|.\Recipe3.msl;

  這些符號表示,每一個模型層對應文件的路徑。

  當把模型層定義數據做爲資源嵌入程序集中時,你不會被只引用可執行程序集的鏈接字符串語法所限制。表7-1展現了,你可能在別的程序集中引用嵌入模型層數據的結構。

表7-1. 加載模型層數據的鏈接字符串語法

 

7-4  部署模型

問題

  當你從數據庫導入模型時,你想使用實體框架的單複數服務。

解決方案

  假設你有如圖7-3所示數據庫表。

圖7-3 數據庫的表Employees和Tasks

   注意圖7-3中的表使用複數形式。這是不少數據庫的常見用法。有些DBA認爲,全部的表都應該使用複雜形式;另外一些則反對這種做法。還有少數DBA,彷佛不使用上面的任何一種作法,而是混合使用。依據你的觀點,你也許對模型實體對應的表名使用單數形式。實體框架提供的複數服務,會自動地將實體名從單數形式生成適當的複數形式。

  爲了在導入表時使用單複數服務,須要在實體數據模型嚮導的最後一步(如圖7-4),勾選上肯定所生成對象名稱的單複數形式。默認狀況下,這個複選框是勾選上的。

圖7-4. 啓用複數服務

 

   圖7-5展現的是,在導入圖7-3中的表建立模型時,沒有使用單複數服務。注意,實體名直接使用了表名,並保持了複數形式。圖7-6展現的是導入相同的表建模時,啓用單複數服務後,實體名使用的是表名的單數形式。

圖7-5. 導入圖7-3中的表建立模型時,沒有使用單複數服務

 

圖7-6. 導入圖7-3中的表建立模型時,啓用單複數服務

 

原理

  不少開發人員喜歡使用圖7-6中所展現的實體名形式,(請看實體上邊黑體字名稱)。他們不光是使用單數形式的實體名,就連Task實體中的導航屬性也不是使用圖7-5中所展現的那種複數形式。在這兩種狀況下,導航屬性是一個實體引用,不是一個集合。圖7-5中的複數形式,容易形成混淆。

  若是咱們的表名是單數形式,單複數服務會正確地複數化基於集合的導航屬性和實體集的名稱。 這是爲了照顧另外一半使用單數形式表名的DBA社區。

  你能夠經過修改「以複數形式表示新對象」屬性,來設置添加新實體到模型時,單複數服務的默認狀態爲on/off(開啓/關閉)。

  你能夠在實體框架以外使用這個單複數服務,它在System.Data.Entity.Design命名空間中,使用時須要引用System.Data.Entity.Design.dll,你還要將你項目的框架從.NET Framwork4 Client Profile修改爲.NET Framwork4(譯註:若是已是該框架,就不用修改了)。這個修改操做在項目的屬性裏。代碼清單7-3,演示了單複數服務對單詞「Person"和"People"的單複數化。

代碼清單7-3. 使用單複數服務

1             var service = PluralizationService.CreateService(new CultureInfo("en-US"));
2             string person = "Person";
3             string people = "People";
4             Console.WriteLine("The plural of {0} is {1}", person,
5              service.Pluralize(person));
6             Console.WriteLine("The singular of {0} is {1}", people,
7              service.Singularize(people));    

代碼清單7-3的輸出以下:

The plural of Person is People
The singular of People is Person

 

 

實體框架交流QQ羣:  458326058,歡迎有興趣的朋友加入一塊兒交流

謝謝你們的持續關注,個人博客地址:http://www.cnblogs.com/VolcanoCloud/

相關文章
相關標籤/搜索