Entity Framework: Làm cách nào để tắt tải chậm cho truy vấn cụ thể?


88

Có cách nào để tắt tải chậm cho truy vấn cụ thể trên Entity Framework 6 không? Tôi muốn sử dụng nó thường xuyên, nhưng đôi khi tôi muốn tắt nó đi. Tôi đang sử dụng các thuộc tính ảo để tải chúng một cách lười biếng.


20
đặt bối cảnh.Configuration.LazyLoadingEnabled = false; trước khi truy vấn mà bạn muốn chạy
Karthik Ganesan

5
Bạn chỉ có thể đặt giá trị this.Configuration.LazyLoadingEnabled = false;, sau đó đặt lại this.Configuration.LazyLoadingEnabled = true;? Ngoài ra, bạn có thể đọc msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

1
cảm ơn bạn @KarthikGanesan. Nó đã hoạt động như mong đợi.
Marco Alves

@KarthikGanesan Bạn có thể đặt nhận xét của mình như một câu trả lời không? Nó hoạt động rất tốt :)
Sampath

1
Đã thêm nhận xét dưới dạng câu trả lời @Sampath
Karthik Ganesan

Câu trả lời:


76

đặt mã sau trước truy vấn bạn muốn thực hiện

context.Configuration.LazyLoadingEnabled = false;

40

Bạn có thể vô hiệu hóa Lazy loading cho truy vấn cụ thể như sau:

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

20

Tôi có thể thiếu một cái gì đó ở đây, nhưng thay vì thay đổi cấu hình mỗi lần, có thể một cách tiếp cận khác là chỉ sử dụng .Include()trên những truy vấn mà bạn muốn tải không?

Giả sử chúng ta có một Productlớp có thuộc tính điều hướng cho một Colourlớp, bạn có thể tải Colourmột lớp Productnhư thế này -

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

1
Đối với tôi đây là câu trả lời tốt nhất ở đây!
Ian

Điều này không phù hợp nếu bạn chỉ muốn tải "sản phẩm" mà không có bất kỳ sản phẩm nào.
Mackan

Vì vậy, bạn muốn nhận 'Sản phẩm' mà không có bất kỳ đối tượng liên quan nào của chúng hoặc 'Sản phẩm có tất cả các đối tượng liên quan của chúng?'
Parrybird

1
Câu trả lời hữu ích hơn nhiều. Điều này kiểm soát các bảng phụ cụ thể được tải tại điểm mà truy vấn đang được xây dựng. Đối với bất kỳ vấn đề nào trong thế giới thực, đây phải là con đường để đi.
Richard Petheram

5
Nó hữu ích theo một cách khác ... nếu bạn làm theo cách này, người ta vẫn có thể tải lười biếng cho một bộ sưu tập khác từ 'Sản phẩm'. Trên thực tế, vô hiệu hóa tải chậm sẽ hiệu quả hơn để đảm bảo rằng tất cả dữ liệu cần thiết đều được tìm nạp trước và tránh tạo ra các tắc nghẽn hiệu suất ẩn.
Doug

15

Chuyển đến thuộc tính sơ đồ của bạn và tìm thuộc tính được chỉ định để tải chậm và vô hiệu hóa nó.

Nếu bạn đang sử dụng mã trước tiên, hãy chuyển đến vùng cấu hình của bạn và tắt nó từ đó bằng:

this.Configuration.LazyLoadingEnabled = false;

6
Rất nhiều người đang truy cập câu hỏi này và tôi muốn nói rằng, mọi người KHÔNG VIẾT CÂU HỎI BẰNG CÁCH NHÌN VÀO KẾ HOẠCH THI CÔNG. Luôn biết mã của bạn gửi đến cơ sở dữ liệu gì nếu không bạn sẽ gặp vấn đề về hiệu suất. Bạn có thể sử dụng linq pad hoặc các công cụ khác để xem truy vấn thực và kiểm tra.
Juan


3

Một phê duyệt khác cho Phiên bản EF khác (Khuôn khổ thực thể 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

Khi nào contextlà một ObjectContext, người tiền nhiệm ít nhiều không được dùng nữa của trình bao bọc của nó DbContext,.
Gert Arnold

2

Giả sử bạn có cái này:

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

Bạn vẫn nhận được tải chậm, mặc dù cài đặt rõ ràng là không. Cách khắc phục rất dễ dàng, hãy thay đổi nó thành cái này:

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.