我工作的一個CRM風格的MVC的Web應用程序,它具有以下(簡化)架構:EF 4.1基於的DbContext,POCO的對象是不懶加載內部導航性能
聯繫人表
- 的ContactID
- 用的名字
- 姓
- 等等
標籤表
- 標籤識別
- 價值
ContactTags表
- 的ContactID
- 標籤識別
我已經牛逼母雞從* .edmx文件生成POCO對象,與基於DbContext的實體上下文進行交互,隱藏ContactTags表,以便將Contact和Tag實體之間的關係建模爲多對多關聯。然後,我已經限制對原始Contact.Tags導航屬性的訪問,將其設置爲內部而不是公共,並公開了一個ReadOnlyCollection,它可以在域圖層之外用於顯示標籤,但將集合上的數據操作限制爲聯繫人.EditTags()方法。
在編寫UI代碼以顯示聯繫人上的標籤列表時,我發現標籤導航屬性沒有被延遲加載。在抓我的頭並搜索了一下之後,我在EF CTP4 lazy loading not playing ball處發現了另一個問題,它符合我的問題。問題的作者發現,當他將內部財產更改爲公開時,它開始工作,果然這也是我發生的事情 - 我已經將標籤導航屬性更改爲公開,現在它正在工作。
我從視圖中的對象的建模/數據封裝點不舒服與此,由於UI不應給予訪問原始標籤集合這將使控制器的代碼來調用Tags.Add(),標籤。刪除等
有沒有人知道這是一個錯誤,還是EF團隊的故意設計決定?是否有可能獲得內部導航屬性延遲加載?我知道我們可以急切加載,但如果可能的話,我們希望避免這種情況。
感謝您的答案 - 當你這樣說的話,這是有道理的,我可以看到爲什麼它需要這樣。猜猜我忘記了延遲加載,然後在這種情況下進行熱切加載! – jonsidnell 2011-05-04 08:04:20
@jsidnell:順便說一句:我曾經玩過一些內部屬性和急切的加載,發現似乎有必要在Fluent API中指定每個內部標量和導航屬性。例如,當我沒有在Fluent API中指定列時,內部標量屬性完全從模型中排除(沒有創建數據庫列)。似乎有一個慣例說:如果一個屬性不公開,則將其從模型中排除,除非Fluent API明確定義該屬性。就像你移動到渴望加載你的內部屬性時的提示一樣。 – Slauma 2011-05-04 09:25:01