簡體   English   中英

如何防止Entity Framework加載所有子對象

[英]How to prevent Entity Framework from loading all child objects

我目前正在使用實體框架使用ASP.NET MVC構建論壇我有3個主要模型[類別] 1 - * [論壇] 1 - * [發布]

如果我有5個類別,每個有4個論壇,每個論壇有1000個帖子,我想只顯示類別,當我這樣做,這意味着我也選擇了20000個帖子?

因為每個Category對象都有一個List <'Forum'>,並且由於映射和關系,每個Forum對象都有List <'Post'>

您可以使用延遲加載來防止檢索子對象。 看到這里 默認情況下應啟用延遲加載。

延遲加載是在第一次訪問引用實體/實體的屬性時從數據庫自動加載實體或實體集合的過程。

使用POCO實體類型時,通過創建派生代理類型的實例然后重寫虛擬屬性以添加加載掛鈎來實現延遲加載。 例如,當使用下面定義的Blog實體類時,將在第一次訪問Posts導航屬性時加載相關的Posts:

public virtual ICollection<Post> Posts { get; set; } 

您可以使用.Include()實現特定的.Include()加載。 例如:

db.Forums.Include(i => i.Posts)

在dbcontext文件中設置lazyloading=false

使用存儲的SQL過程僅顯示有問題的類別。 我假設經常使用此功能,因此會影響性能。 SP是預編譯的,執行計划是已知的,另外你可以從aFewTablesnJoins中添加一個select distinct categoryfield,其中someId = @參數在你的類別查詢中 - Less IO,admin對性能更滿意。 當然,如上所述,懶惰實例化總是一種選擇。

好的,我找到了這個例子,它使用Explicit Loading和IN運算符。 代碼如下所示:

(依賴實體,有FK TutorId)[課程] N - > -------- 1 [Tutor](主要實體)

(依賴實體,有FK SubjectId)[課程] N - > ----- 1 [主題](主要實體)

// get all courses 
IEnumerable<Course> courses = context.Courses.ToList(); 
// select tutor ids from courses (C# logic, without DB access)
IEnumerable<int> tutorIds = courses.Select(c => c.TutorId);
// select subject ids from courses (C# logic, without DB access)
IEnumerable<int> subjectIds = courses.Select(c => c.SubjectId); 

context.Tutors.Where( t => tutorIds.Contains(t.TutorId) ).Load();
context.Subjects.Where( s => subjectIds.Contains(s.SubjectId) ).Load();

這似乎應該有效,但我需要測試它,並給你一個提示,如果它對我有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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