2015-07-12 20 views
37

Tải trọng lười trong Khuôn khổ Thực thể là hiện tượng mặc định xảy ra khi tải và truy cập các thực thể liên quan. Tuy nhiên, tải háo hức được gọi là thực hành lực tải tất cả các mối quan hệ này. Tôi đã đi qua các câu hỏi dưới những gì tình hình mong muốn tải có thể có lợi hơn so với lười biếng tải. Yêu cầu điều này, bởi vì rõ ràng là việc tải xuống lười biếng thân thiện hơn và thậm chí nếu chúng ta sử dụng phương thức ToList(), chúng ta vẫn có thể tận dụng được hành vi tải lười. Tuy nhiên, tôi nghĩ có lẽ tải lười biếng làm tăng số lượng yêu cầu đến cơ sở dữ liệu thực tế và có thể đó là lý do tại sao đôi khi nhà phát triển sử dụng phương thức Inlcude để buộc tải tất cả các mối quan hệ. Ví dụ, khi sử dụng Visual Studio auto-scaffolding trong MVC 5, phương thức Index được tạo tự động trong controller luôn sử dụng Eager Loading, và tôi luôn có câu hỏi tại sao Microsoft sử dụng Eager Loading theo mặc định trong trường hợp đó.Tải Lười Biếng và Tải Eager Đang tải

Tôi sẽ đánh giá cao nếu ai đó giải thích cho tôi theo tình huống tải mong muốn sẽ mang lại lợi ích hơn là tải lười biếng và tại sao chúng tôi sử dụng nó trong khi có thứ gì đó thân thiện hơn như tải Lazy.

+6

Hãy tưởng tượng một tình huống mà bối cảnh db của bạn sẽ được xử lý và tải lười biếng không thể xảy ra nữa. Sau đó, tải háo hức là có lợi. – Transcendent

+1

Tôi đã thấy rất nhiều dự án không thành công do vấn đề về hiệu suất do vấn đề "N + 1 Select" sẽ xảy ra nhanh hơn khi tải xuống, vì vậy hãy chắc chắn xem xét số –

Trả lời

37

Tôi nghĩ rằng nó là tốt để phân loại các mối quan hệ như thế này

Khi sử dụng háo hức tải

  1. Trong "một bên" các mối quan hệ một-nhiều mà bạn chắc chắn được sử dụng mọi nơi với thực thể chính. như Thuộc tính người dùng của một Điều. Thuộc tính danh mục của Sản phẩm.
  2. Nói chung Khi quan hệ không quá nhiều và mong muốn tải sẽ là thực hành tốt để giảm các truy vấn thêm trên máy chủ.

Khi sử dụng lười biếng tải

  1. Hầu như trên tất cả các "bộ sưu tập phụ" của mối quan hệ một-nhiều. như Bài viết của Người dùng hoặc Sản phẩm của một Danh mục
  2. Bạn biết chính xác rằng bạn sẽ không cần tài sản ngay lập tức.

Lưu ý: như Siêu cho biết có thể có vấn đề xử lý với tải lười biếng.

+5

Tôi lãng phí chỉ cố trả lời cùng một điều. Sử dụng tải chậm khi bạn biết bạn hiếm khi cần sử dụng dữ liệu liên quan. Nhưng khi bạn biết bạn sẽ muốn một số dữ liệu liên quan một cách thường xuyên, hãy sử dụng tải háo hức. –

8

Tải trọng kém sẽ tạo ra một số cuộc gọi SQL trong khi tải Eager có thể tải dữ liệu bằng một cuộc gọi "nặng hơn" (có kết nối/truy vấn phụ).

Ví dụ: Nếu có ping cao giữa máy chủ web và máy chủ sql của bạn, bạn sẽ chuyển sang tải Eager thay vì tải các mục có liên quan 1-by-1 bằng Tải chậm.

9

Hãy xem xét các tình huống dưới đây

public class Person{ 
    public String Name{get; set;} 
    public String Email {get; set;} 
    public virtual Employer employer {get; set;} 
} 

public List<EF.Person> GetPerson(){ 
    using(EF.DbEntities db = new EF.DbEntities()){ 
     return db.Person.ToList(); 
    } 
} 

Bây giờ sau khi phương pháp này được gọi là không, bạn có thể lười biếng tải đơn vị Employer nữa. Tại sao? vì đối tượng db được xử lý. Vì vậy, bạn phải làm Person.Include(x=> x.employer) để buộc phải được tải.

+2

Có, đó là ví dụ khi tải Lười biếng không giúp được gì. Một điều nữa là tạo DbContext mọi lúc, bạn sẽ cần một số dữ liệu là cách xấu. Nếu bạn có một số container IoC, DbContext của bạn sẽ sống cùng với Yêu cầu (trong trường hợp các ứng dụng web). –

+0

@MiroslavHolec: Rực rỡ, đó là những gì tôi thực sự sử dụng Ninject. Những gì bạn vừa đề cập thực sự rất hay. – Transcendent

0
// Using LINQ and just referencing p.Employer will lazy load 
// I am not at a computer but I know I have lazy loaded in one 
// query with a single query call like below. 
List<Person> persons = new List<Person>(); 
using(MyDbContext dbContext = new MyDbContext()) 
{ 
    persons = (
     from p in dbcontext.Persons 
     select new Person{ 
      Name = p.Name, 
      Email = p.Email, 
      Employer = p.Employer 
     }).ToList(); 
} 
+0

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. – Arefly

+0

Câu trả lời này không giải quyết được câu hỏi của OPs. OP không hỏi làm thế nào để làm 'Lazy loading', anh ta hỏi về" khi nào nên dùng "Lazy loading' và khi' Eager Loading' " – Mischa

5

Háo hức Chở Hàng: Háo hức tải giúp bạn tải tất cả các đối tượng cần thiết của bạn cùng một lúc. I E.các đối tượng liên quan (đối tượng con) được tải tự động với đối tượng mẹ của nó.

Khi sử dụng:

  1. Sử dụng Háo hức tải khi các mối quan hệ không phải là quá nhiều. Do đó, Tải hình ảnh là một phương pháp hay để giảm các truy vấn khác trên Máy chủ.
  2. Sử dụng Eager Đang tải khi bạn chắc chắn rằng mình sẽ sử dụng các thực thể có liên quan với thực thể chính ở mọi nơi.

Lazy Chở Hàng: Trong trường hợp tải lười biếng, các đối tượng liên quan (đối tượng trẻ em) không được nạp tự động với đối tượng cha của nó cho đến khi họ được yêu cầu. Theo mặc định LINQ hỗ trợ tải chậm.

Khi sử dụng:

  1. Sử dụng Lazy Loading khi bạn đang sử dụng một-nhiều bộ sưu tập.
  2. Sử dụng Tải khi tải xuống khi bạn chắc chắn rằng bạn hiện không sử dụng các thực thể liên quan.

LƯU Ý: Entity Framework ủng hộ ba cách để tải dữ liệu liên quan - tải háo hức, lười tải và tải rõ ràng.

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