2012-10-13 18 views
10

Thay vì phải làm như sau trên mỗi truy vấn, có cách nào để chỉ đặt giá trị đó trên toàn cầu không? Có một cài đặt tải lười trong chế độ xem mô hình, nhưng có vẻ như không phải là cài đặt cho ProxyCreation.Vô hiệu hóa vĩnh viễn Configuration.ProxyCreationEnabled trong EF?

 using (var context = new LabEntities()) 
     { 
      **context.Configuration.ProxyCreationEnabled = false;** 

      var Query = from s in context.EAssets 
         .Include("Server").Include("Type").Include("Type.Definition") 
         where (s.Type.Definition.b_IsScannable == true) && 
         (s.Server.s_Domain == Environment.UserDomainName || s.Server.s_Domain == null) 
         select s; 
      var Entities = Query.ToList(); 
     } 

Tôi không hiểu đầy đủ những lợi ích của tùy chọn này, nhưng tôi biết rằng trong visual studio là thẻ tất cả các đối tượng của tôi với hậu tố serial gibberish và làm cho việc sử dụng chương trình gỡ rối bất hợp lý.

Trả lời

20

Bạn có thể vô hiệu hóa nó trong các nhà xây dựng, do đó nó được vô hiệu hóa bất cứ lúc nào bạn tạo ra một bối cảnh mới:

public class LabEntities : DbContext 
{ 
    public LabEntities() 
    { 
     Configuration.ProxyCreationEnabled = false; 
    } 
} 
+7

Điều gì sẽ xảy ra với sự cố khi tạo tệp tự động vui vẻ nếu bạn làm mới mô hình? Không phải các chỉnh sửa thủ công sẽ vượt qua bài viết phải không? – jwrightmail

+0

Sự cố với việc tạo tệp tự động là gì? –

+1

Để vô hiệu hóa nó trong hàm tạo, bạn phải chỉnh sửa tệp được tạo tự động. Trong trường hợp của tôi, datamodel.context.cs của nó. <được tạo tự động> // Mã này được tạo từ mẫu. // // Thay đổi thủ công đối với tệp này có thể gây ra hành vi không mong muốn trong ứng dụng của bạn. // Các thay đổi thủ công đối với tệp này sẽ bị ghi đè nếu mã được tạo lại. // jwrightmail

15

Nếu bạn đang sử dụng một cách tiếp cận mô hình đầu tiên, có nghĩa là bạn có một tập tin .edmx, cách để tắt vĩnh viễn tùy chọn này là sửa đổi tệp .Context.tt. Tệp này là một mẫu tạo mã mà quá trình xây dựng sử dụng để tạo ra lớp dẫn xuất DbContext của bạn.

mở tập tin này và xác định vị trí các nhà xây dựng:

public <#=Code.Escape(container)#>() 
     : base("name=<#=container.Name#>") 
    { 
<# 
     WriteLazyLoadingEnabled(container); 
#> 
     //add the following line of code 

     this.Configuration.ProxyCreationEnabled = false; 
    } 

sau đó thêm các dòng mã để thiết lập thuộc tính này là false. Xây dựng lại dự án của bạn và xác minh ngữ cảnh đã tạo chứa dòng.

+2

Đây là câu trả lời đúng trong quan điểm của tôi. Tuy nhiên, hãy cẩn thận, nếu nâng cấp Entity Framework trong tương lai vì nó có thể ghi đè lên các thay đổi của bạn đối với tệp .tt. (Trừ khi tôi nhầm?) – rwalter

+0

Luôn tự hỏi về điều đó ... Tôi rất thích nhìn thấy câu trả lời mở rộng lớp từng phần được tạo ra bằng cách sử dụng DbContext (không định nghĩa 'OnContextCreated'). – seebiscuit