9

Trong điều khiển được tạo ra bởi Visual Studio, cũng như các ứng dụng mẫu (ContosoUniversity), hành động Index luôn có cái gì đó nhưMục đích của Bao gồm() trong ASP.NET MVC + Entity Framework

var departments = db.Departments.Include(d => d.Administrator); 

gì sự khác biệt giữa điều đó và

var departments = db.Departments; 

Đầu tiên tôi nghi ngờ rằng người đầu tiên (có Bao gồm) cho phép chế độ xem truy xuất bộ phận.Quản trị viên. Nhưng thứ hai (không bao gồm) dường như cũng có thể làm điều đó.

Trả lời

13

Include yêu cầu Khung thực thể hoạt động háo hức tải Quản trị viên cho từng Bộ trong kết quả. Trong trường hợp này, Entity Framework có thể sử dụng một phép nối SQL để lấy dữ liệu từ cả hai bảng trong một yêu cầu duy nhất.

Mã sẽ vẫn hoạt động mà không có Bao gồm, nhưng lần đầu tiên bạn truy cập Quản trị viên của Cục, EF sẽ cần phải nhấn cơ sở dữ liệu để tải nó (vì nó chưa được tải trước). Tải dữ liệu theo yêu cầu (lazily) là một tính năng tốt đẹp nhưng nó có thể là một vấn đề hiệu suất nghiêm trọng (được gọi là một vấn đề N+1). Đặc biệt là nếu bạn đang truy cập Quản trị viên cho từng Bộ (ví dụ, trong một vòng lặp) - thay vì một cuộc gọi cơ sở dữ liệu, bạn sẽ kết thúc với nhiều!

+0

Không chắc chắn nếu tôi hiểu nó một cách chính xác. Với Bao gồm, EF sẽ sử dụng tham gia để lấy cả Sở và Quản trị viên của họ trong một truy vấn. Nếu không có Bao gồm, EF sẽ chỉ lấy các Sở và sau đó lấy Quản trị viên của họ theo yêu cầu? Vì vậy, nếu tôi chỉ cần một hoặc hai Quản trị viên trong các Cơ sở, tôi không nên sử dụng Bao gồm. Nhưng nếu tôi cần Quản trị viên của tất cả (hoặc hầu hết) Deparments, tôi nên sử dụng Bao gồm. – Jim

+1

Chính xác, bao gồm buộc các Quản trị viên được tải trong cùng một truy vấn tải các Sở. Nếu không có bao gồm, các quản trị viên được nạp một lúc một lần theo yêu cầu. –

+0

@Jim, cụ thể, vì bạn sử dụng ASP.NET MVC, bạn không muốn Chế độ xem của mình liên hệ với cơ sở dữ liệu. Và đối với 'departments.First(). Quản trị viên 'làm việc không có quyền truy cập cơ sở dữ liệu,' Quản trị viên' cần phải được tải trước bằng cách sử dụng 'Bao gồm'. – bzlm

1
var departments = db.Departments; 

chí này lấy ra các lĩnh vực tổng hợp chỉ khi LazyLoadingEnabled được kích hoạt & MultipleActiveResultSets được thiết lập là true trong chuỗi kết nối.

+0

Cảm ơn câu trả lời. Tôi đã bỏ phiếu và tôi ước mình có thể đánh dấu nhiều câu trả lời. – Jim

2

Trong trường hợp đầu tiên (có Bao gồm) khi bạn viết department.Administrator máy chủ đối tượng từ bộ nhớ đã được tải háo hức do phương pháp Include. Trong trường hợp thứ hai, một câu lệnh sql sẽ được thực hiện để lấy bản ghi Quản trị viên từ db cho từng đối tượng của bộ phận.

+0

Cảm ơn câu trả lời. Tôi đã bỏ phiếu và tôi ước mình có thể đánh dấu nhiều câu trả lời. – Jim