翻譯的初衷以及為什么選擇《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/