2010-06-03 33 views
55

Dường như tải chậm được bật theo mặc định trong EF4. Ít nhất, trong dự án của tôi, tôi có thể thấy rằng giá trị củaTắt tải chậm theo mặc định trong Entity Framework 4

dataContext.ContextOptions.LazyLoadingEnabled 

là đúng theo mặc định. Tôi không muốn tải chậm và tôi không muốn phải viết:

dataContext.ContextOptions.LazyLoadingEnabled = false; 

mỗi lần tôi nhận được ngữ cảnh mới. Vì vậy, có một cách để tắt nó đi theo mặc định, nói rằng, trên toàn bộ dự án?

Trả lời

63

Câu trả lời sau đây đề cập đến Database-First hoặc Model-Đầu workflow (hai công việc duy nhất mà đã có sẵn với Entity Framework (phiên bản < = 4.0) khi câu hỏi được hỏi). Nếu bạn đang sử dụng Mã đầu tiên quy trình làm việc (có sẵn từ phiên bản EF> = 4.1), hãy chuyển đến câu hỏi này để có giải pháp đúng cho số answer của ssmith.


Các tập tin edmx có trong định nghĩa <ConceptualModel><EntityContainer> một thuộc tính để tải lười biếng, nơi bạn có thể thiết lập tải lười biếng thường false:

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false"> 

Điều này tạo ra các thiết lập sau đây trong constructor ObjectContext:

public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext") 
{ 
    this.ContextOptions.LazyLoadingEnabled = false; 
    OnContextCreated(); 
} 

Ví dụ của tôi không có nghĩa là cách tạo ra ObjectContext (hoặc)trong phiên bản EF mới hơn) nên được chỉnh sửa thủ công (sẽ được ghi đè lên với mọi cập nhật mô hình từ cơ sở dữ liệu, như ctorx đã chỉ ra) nhưng phần tử EntityContainer trong phần edmx:ConceptualModels của tệp EDMX phải được chỉnh sửa bằng cách thêm thuộc tính annotation:LazyLoadingEnabled="false" - hoặc bằng tay trong trình soạn thảo XML hoặc trên trang thuộc tính của bề mặt thiết kế, nơi tùy chọn này có sẵn. Sửa đổi này của tập tin EDMX sẽ tự động tạo ra các lớp bối cảnh với các tùy chọn tải lười biếng bị vô hiệu hóa trong constructor như được hiển thị ở trên. Bản sửa đổi tệp EDMX không bị ghi đè khi mô hình được cập nhật từ cơ sở dữ liệu.

+0

Hoàn hảo, cảm ơn. –

+15

Điều này yêu cầu bạn sửa đổi mã được tạo, mã sẽ bị ghi đè nếu bạn sửa đổi mô hình của mình. Xem xét đặt một ObjectContextFactory tại chỗ, và thực hiện thay đổi trong nhà máy. Bằng cách đó, bạn vẫn chỉ thiết lập tùy chọn một lần và bạn không thay đổi mã được tạo tự động. – ctorx

+0

@ctorx - AFAICT là một lựa chọn đơn giản hơn so với nhà máy sẽ chỉ thực hiện một phần OnContextCreated để tắt tải xuống? Hay tôi đang thiếu một cái gì đó? –

58

Tôi đã viết mẫu nhanh hiển thị how the new Lazy Loading features work with EF Code First. Đạt được những gì bạn muốn trong mô hình Mã Đầu tiên chỉ đơn giản là vấn đề của việc thêm một dòng vào constructor DbContext của bạn, như vậy:

public BlogContext() 
{ 
    this.Configuration.LazyLoadingEnabled = false; 
} 
+10

Không quan trọng lắm, nhưng cả ': base()' và 'this.' đều thừa trong mã này. –

+0

Về mặt chức năng, vâng, về mặt khả năng đọc, tôi cho rằng đôi khi nó có ích khi bao gồm 'this'. Tôi đồng ý về 'base()' mặc dù, tôi không thể nghĩ ra một lý do để thêm điều đó. –

+0

Vâng, không chắc tại sao base() lại ở trong đó. Đã xóa. – ssmith

24

Nếu bạn có thể được sử dụng EF4 Mã Thứ nhất, yeah? Vì vậy, trong Khởi tạo ngữ cảnh của bạn, có ghi đè 'OnModelCreated'.

Trong phương pháp này, tôi chỉ cần gọi và thiết lập thuộc tính và tất cả đã được giải quyết.

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    base.Configuration.LazyLoadingEnabled = false; 
} 

Mô hình của tôi bây giờ ngon miệng hơn nhiều. Lười biếng tải là tuyệt vời ... nhưng không phải khi bạn không muốn nó. Và khi bạn bắt đầu có tham khảo vòng tròn, nó chỉ là vô lý.

+4

Điều này sẽ không hoạt động bởi vì nó sẽ vô hiệu hóa tải lười biếng chỉ cho trường hợp bối cảnh xây dựng mô hình (thường là trường hợp được sử dụng đầu tiên sau khi ứng dụng bắt đầu). Đối với tất cả các trường hợp ngữ cảnh sau này, 'OnModelCreating' không được gọi và 'LazyLoadingEnabled' sẽ có giá trị mặc định - đó là' true'. – Slauma

+0

@Slauma - Tôi đã nhấn chính xác cùng một vấn đề ngày hôm nay và tôi đã chỉnh sửa câu trả lời này (vì đó là câu trả lời được chấp nhận) để thay đổi nó thành cài đặt trong ctor thay thế. Nếu tôi có sức mạnh để thay đổi câu trả lời được chấp nhận từ câu trả lời này cho bạn, tôi sẽ làm điều đó thay thế. :) –

+1

@JamesManning: Câu hỏi này có một lịch sử kỳ lạ. Câu trả lời của tôi đã được chấp nhận vài tháng trước. Nhưng câu trả lời của tôi không tốt (nhà phê bình ctorx rất hợp lệ). Sau đó, chủ sở hữu câu hỏi đã chuyển chấp nhận cho câu hỏi này, điều này hoàn toàn sai cho đến khi bạn chỉnh sửa. Hơn nữa nó là một câu trả lời cho 'DbContext' xuất hiện muộn hơn nhiều so với câu hỏi đã được hỏi và các đoạn mã trong câu hỏi vẫn còn cho' ObjectContext'. Bây giờ bạn đã chỉnh sửa nó thành một câu trả lời đúng cho 'DbContext' nhưng bây giờ nó giống như câu trả lời của ssmith hơn một năm. Nhưng cả hai không phải là câu trả lời cho 'ObjectContext'. Khá điên rồ :) – Slauma

21

Bạn cũng có thể làm điều đó từ nhà thiết kế. Chỉ cần mở tệp .edmx, nhấp chuột phải vào bất kỳ đâu trên mô hình và chọn Thuộc tính. Sau đó, đặt LazyLoadingEnabled thành sai. enter image description here

4

Nếu bạn đang lập mô hình mã đầu tiên, chỉ cần xóa từ khóa virtual trên thuộc tính đối tượng/tham chiếu của bạn. Có ảo trên một tham chiếu sẽ cho phép LazyLoading trên tham chiếu cụ thể đó.

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