2011-10-12 32 views
49

Nếu tôi đã tuyên bố mối quan hệ thực thể trong mô hình của tôi như ảo thì không có nhu cầu sử dụng câu lệnh Include trong truy vấn LINQ của tôi, phải không ?? -Entity Framework 4.1 Thuộc tính ảo

Đối với ví dụ: Đây là lớp mô hình của tôi :

public class Brand 
{ 
    public int BrandID { get; set; } 
    public string BrandName { get; set; } 
    public string BrandDesc { get; set; } 
    public string BrandUrl { get; set; } 

    public virtual ICollection<Product> Products { get; set; } 
} 

Bây giờ, đối với lớp mô hình ở trên, tôi không cần sử dụng var brandsAndProduct = pe.Brands.Include("Products").Single(brand => brand.BrandID == 22);.

Thay vào đó, tôi chỉ có thể sử dụng đơn giản var brandsAndProduct = pe.Brands.Where(brand => brand.BrandID == 22); và tôi sẽ tự động có thực thể liên quan có sẵn khi được truy cập.

Tôi có chính xác trong sự hiểu biết của mình không?

Ngoài ra, vui lòng cho tôi biết trong trường hợp nào tôi nên thích cái này hơn cái kia ??

Trả lời

158

Bạn đúng nhưng quy tắc phức tạp hơn để làm cho nó thực sự hoạt động như mong đợi. Nếu bạn xác định thuộc tính điều hướng của mình virtual EF sẽ ở thời gian chạy tạo lớp mới (proxy động) bắt nguồn từ lớp Brand của bạn và sử dụng nó thay thế. Lớp mới được tạo động này chứa logic để tải thuộc tính điều hướng khi được truy cập lần đầu tiên. Tính năng này được gọi là tải chậm (hoặc tải lười biếng trong suốt tốt hơn).

gì quy tắc phải được đáp ứng để làm cho công việc này:

  • Tất cả các thuộc tính định hướng trong lớp phải virtual
  • động tạo proxy phải không bị vô hiệu hóa (context.Configuration.ProxyCreationEnabled). Nó được kích hoạt theo mặc định.
  • Không được tắt tải trọng lười (context.Configuration.LazyLoadingEnabled). Nó được kích hoạt theo mặc định.
  • Thực thể phải được đính kèm (mặc định nếu bạn tải thực thể từ cơ sở dữ liệu) vào bối cảnh và bối cảnh không được xử lý = tải chậm chỉ hoạt động trong phạm vi ngữ cảnh sống được sử dụng để tải nó từ cơ sở dữ liệu (hoặc nơi thực thể được đính kèm)

Ngược lại với tải chậm được gọi là tải mong muốn và đó là những gì Include thực hiện. Nếu bạn sử dụng Include thuộc tính điều hướng của bạn được tải cùng với thực thể chính.

Việc sử dụng tải chậm và tải háo hức tùy thuộc vào nhu cầu của bạn và cũng về hiệu suất. Include tải tất cả dữ liệu trong truy vấn cơ sở dữ liệu đơn lẻ nhưng có thể dẫn đến huge data set khi sử dụng nhiều hoặc bao gồm nhiều thực thể. Nếu bạn chắc chắn rằng bạn sẽ cần Brand và tất cả Products để xử lý, bạn nên sử dụng tải mong muốn.

Tải trọng lần lượt được sử dụng nếu bạn không chắc chắn thuộc tính điều hướng nào bạn sẽ cần. Ví dụ: nếu bạn tải 100 thương hiệu nhưng bạn sẽ chỉ cần truy cập các sản phẩm từ một thương hiệu thì không cần phải tải sản phẩm cho tất cả các thương hiệu trong truy vấn ban đầu. Điểm bất lợi của tải lười là truy vấn riêng biệt (vòng tròn cơ sở dữ liệu) cho mỗi thuộc tính điều hướng => nếu bạn tải 100 nhãn hiệu mà không bao gồm và bạn sẽ truy cập thuộc tính Products trong mỗi trường hợp Brand mã của bạn sẽ tạo ra 100 truy vấn khác để điền các thuộc tính điều hướng này = háo hức tải sẽ chỉ sử dụng truy vấn singe nhưng tải lười biếng được sử dụng 101 truy vấn (nó được gọi là N + 1 vấn đề).

Trong các tình huống phức tạp hơn, bạn có thể thấy rằng không có chiến lược nào hoạt động theo nhu cầu và bạn có thể sử dụng chiến lược thứ ba được gọi là tải truy vấn hoặc truy vấn riêng biệt để tải thương hiệu và hơn sản phẩm cho tất cả thương hiệu bạn cần.

tải Explicit có nhược điểm tương tự như tải lười biếng nhưng bạn phải kích hoạt nó bằng tay:

context.Entry(brand).Collection(b => b.Products).Load(); 

Các ưu điểm chính để tải rõ ràng là khả năng lọc mối quan hệ. Bạn có thể sử dụng Query() trước Load() và sử dụng bất kỳ tính năng lọc nào hoặc thậm chí mong muốn tải các mối quan hệ lồng nhau.

+3

Tôi cảm thấy câu trả lời này ngắn gọn và đầy đủ ... Cảm ơn. Đã tham chiếu "Đang tải dữ liệu liên quan" http://msdn.microsoft.com/en-us/magazine/hh205756.aspx – Lijo

+0

Cảm ơn câu trả lời của bạn. Nó vẫn giúp tôi trong năm 2016. Và tôi có thêm một câu hỏi: Có cách nào để luôn luôn tải mong muốn mỗi thuộc tính trong một cuộc gọi không? Vì có một số tình huống mà các mô hình có nhiều thuộc tính điều hướng và cần được tải mỗi lần. – anuith

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