2013-04-20 15 views
1

我有2個實體與導航屬性的一對多關聯。延遲加載被禁用。如何停止導航屬性自引用?

var det = db.Detail.Include(m=>m.Master); 

以上聲明還包括Master的導航屬性「Detail」(自引用)。

查看詳細的每個實例我有具有相關細節的嵌套列表嵌套的主人......

我怎樣才能阻止這種遞歸? 我不想檢索Master的導航屬性。

謝謝。

+1

您不是「檢索」Master的導航屬性。相反,發生的事情是EF通過查看內存中的'Detail'對象來填充'master.Details'導航屬性。您可以通過在數據庫服務器上運行分析器來驗證此情況。知道了,這對你來說仍然是一個問題? – hvd 2013-04-20 14:14:16

+0

知道這一點,唯一的問題將是帶寬。正在傳輸冗餘數據,特別是當「詳細信息」中包含大量列和記錄時... – tonymayoral 2013-04-20 14:34:37

回答

0

這不是遞歸。 EF僅加載Detail實體,並且因爲您的Include相關的Master實體。在加載的Master的導航屬性中看到的Detail實體是已作爲父級加載的Detail實體。在實體加載到上下文中後,EF會自動將該對象圖形放在一起。它被稱爲關係修復,您無法停止此操作。

+0

您可以通過不將這些實體加載到上下文中來防止這種情況發生。這是否是一個好主意取決於這個問題的原因。 – hvd 2013-04-20 14:22:47

+0

@hvd:那你必須避免使用'Include'。即使使用「AsNoTracking」,它也會修復對象圖。您必須使用投影'db.Detail.AsNoTracking()。選擇(d => new {Detail = d,Masters = d.Masters})',然後遍歷結果並手動設置'Detail.Masters'。這樣你有一個往返和'Detail.Masters'填充'Master.Detail'設置爲'null'。我不知道另一種方式。 – Slauma 2013-04-20 14:50:37

+0

我正在考慮更多沿'從db.D'的行。詳細選擇新的{d.Field1,d.Field2,...,Master = new {d.Master.Field1,d.Master.Field2,... }}',它不創建'Detail'或'Master'對象。但基於nonino對這個問題的評論,這在這裏不是一個好主意。 – hvd 2013-04-20 14:59:21