2016-07-16 20 views
5

Tôi hiện đang sử dụng Entity Framework để xây dựng Diễn đàn bằng ASP.NET MVC Tôi có 3 mô hình chính [Danh mục] 1 - * [Forum] 1 - * [Post]Làm cách nào để ngăn chặn Entity Framework tải tất cả các đối tượng con

Nếu tôi có 5 danh mục và mỗi người có 4 diễn đàn và mỗi diễn đàn có 1000 bài và tôi muốn chỉ hiển thị danh mục, khi tôi làm điều đó có nghĩa là tôi đã chọn 20000 bài đăng quá ??

Bởi vì mỗi đối tượng Thể loại có một danh sách < 'diễn đàn'> và mỗi Forum đối tượng có Danh sách < 'Đăng'> do lập bản đồ và quan hệ

Trả lời

3

Bạn có thể sử dụng tải lười biếng để ngăn chặn các đối tượng con bị truy xuất. Xem here. Tải trọng lười nên được bật theo mặc định.

Tải trọng chậm là quá trình trong đó một thực thể hoặc tập hợp các thực thể được tự động tải từ cơ sở dữ liệu lần đầu tiên một thuộc tính đề cập đến thực thể/thực thể được truy cập.

Khi sử dụng các loại thực thể POCO, tải chậm được thực hiện bằng cách tạo các thể hiện của các loại proxy có nguồn gốc và sau đó ghi đè các thuộc tính ảo để thêm móc tải. Ví dụ, khi sử dụng các lớp thực thể Blog được định nghĩa dưới đây, các bài viết có liên quan sẽ được nạp lần đầu tiên bài hướng bất động sản được truy cập:

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

Bạn có thể đạt tải háo hức cụ thể bằng cách sử dụng .Include(). Ví dụ:

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

Cảm ơn bạn sir .. Tôi đã tạo thuộc tính Đăng ** virtual **, vì vậy tôi cho rằng tải chậm đã được bật :) – Charaf

+0

Điều gì về Entity Framework Core! không có thứ gì như Lazy Loading Hiện tại! –

+0

@ MichałZiobro Xem câu hỏi này http: // stackoverflow.com/questions/40122162/entity-framework-core-lazy-loading – Nicholas

1

sử dụng thủ tục SQL được lưu trữ để hiển thị chỉ các danh mục được đề cập. Tôi cho rằng chức năng này sẽ được sử dụng thường xuyên, do đó sẽ ảnh hưởng đến hiệu năng. SP được biên dịch sẵn, kế hoạch thực hiện được biết, ngoài ra bạn có thể thêm một thể loại riêng biệtChức năng từ aFewTablesnJoins trong đó tham số someId = @ trong truy vấn danh mục của bạn - Ít IO, quản trị là hạnh phúc hơn về hiệu suất. Tất nhiên sự khởi đầu lười biếng luôn là một lựa chọn như đã nói ở trên.

+0

cảm ơn lời khuyên – Charaf

0

Ok tôi đã tìm thấy ví dụ này và nó sử dụng toán tử tải và IN rõ ràng. Mã này trông như thế này:

(đơn vị phụ thuộc, có FK TutorId) [Khóa học] N -> -------- 1 [Tutor] (thực thể chính)

(đơn vị phụ thuộc , có FK SubjectId) [Khóa học] N -> ----- 1 [Tiêu đề] (thực thể chính)

// 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(); 

có vẻ như điều này nên được làm việc, nhưng tôi cần phải kiểm tra nó và cung cấp cho bạn một gợi ý nếu nó làm việc cho tôi hay không.

0

Đặt lazyloading=false trong tệp dbcontext.

Các vấn đề liên quan