簡體   English   中英

如何在實體框架中自動包含所有基礎導航屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM