[英]How to include all underlying navigation properties automatically with entity framework
場景:我想向數據庫添加一個具有導航屬性的實體, 該實體具有導航屬性..依此類推。 基本上,數據庫中的表是相互連接的-它們都是。
我使用EF4.3和上下文/請求模式,所以我不想啟用延遲加載; 只需花費太多時間來加載我需要的實體。 到目前為止,我已經了解到,除了使用如下所示的include方法外,沒有其他方法可以做到:
context.Set<TEntity>().include("navproperty1").include("navproperty1.navproperty1.1")... and so on.
這種方式的可維護性很差,再加上很多代碼,但是如果我不想為每種實體類型手動編寫所有包含項,還有其他方法嗎?
這里有很多問題。 我會盡力解決每個問題。
首先,延遲加載並不總是更快。 特別是如果您正在加載所有關系。
其次,始終避免使用“魔術弦”。 我不知道接收lambda表達式(它是IQueryable擴展名)的Include
方法是否可用於EF 4.3。 如果不是,您應該像下面顯示的那樣自己實現並使用:
context.Set<TEntity>().include(t => t.NavProp)
“ A”實體與“ B”實體具有1:n的關系,但“ B”實體與“ C”實體具有n:m的關系,如果我不願意將“ C”包括在“ A”中,然后嘗試調用上下文。 SaveChanges(),那么所有數據將在“ B”和“ C”之間丟失
我真的不明白你的意思 但是,如果要選擇一個屬於列表中項目的子導航屬性,則應在EF 5中使用此屬性:(不確定它是否在4.3中有效)
context.Set<TEntity>().Include(t => t.Collection.Select(c => c.SubProp))
其他表達式可以在這里找到
如果您澄清那句話,也許我可以提供更多幫助。
看看這個片段
var dbQuery =
context.Letters.Where(letter => letter.ID == myId)
.Include(l => l.Recipients.Select(y => y.PersonTitle))//this will include letter.Recipients.PersonTitle
.Include(l => l.PersonTitle)
.Include(l => l.Rank)
.Include(l => l.JobTitle);
theLetter = dbQuery.FirstOrDefault();// maybe null returned
這條線
context.Letters.Include(l => l.Recipients.Select(y => y.PersonTitle))
將收到帶有Recipients
字母,並且您可以訪問“收件人”導航屬性中存在的PersonTitle
多數民眾贊成意味着導航屬性 與 導航屬性
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.