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


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

7-3  配置模型

問題

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

解決方案

  當你添加一個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.*這三個文件被復制到程序集的輸出目錄中。它們不會作為資源被嵌入到程序集中。

原理

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

  如果元數據項目處理(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),你會看到連接字符串會改變成類似下面的樣子:

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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM