2012-10-13 120 views
10

而不是必須在每個查詢上執行以下操作,是否有辦法在全局範圍內設置該值?模型視圖中有一個延遲加載設置,但似乎沒有ProxyCreation的設置。在EF中永久禁用Configuration.ProxyCreationEnabled?

 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(); 
     } 

我不完全理解此選項的好處,但我知道,在Visual Studio中的標籤我毫無意義的串行後綴的所有對象,並使用調試器的不合理使。

回答

20

您可以在構造函數中禁用它,所以它被禁用,任何時候你創建一個新的上下文:

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

如果刷新模型會導致自動生成文件,那麼如何處理這個問題呢?不會手動編輯過來寫嗎? – jwrightmail

+0

自動文件生成有什麼問題? –

+1

爲了在構造函數中禁用它,你必須編輯一個自動生成的文件。在我的情況下,它的datamodel.context.cs。 <自動生成的> //此代碼是從模板生成的。 // //手動更改此文件可能會導致應用程序出現意外的行爲。 //如果重新生成代碼,手動更改此文件將被覆蓋。 // jwrightmail

15

如果您使用的是模型的第一種方法,這意味着你有一個.edmx文件,永久禁用此選項的方法是修改.Context.tt文件。該文件是生成過程用於生成DbContext派生類的代碼生成模板。

打開此文件並找到構造函數:

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

     this.Configuration.ProxyCreationEnabled = false; 
    } 

再添加一行代碼來設置該屬性設置爲false。重建項目並驗證生成的上下文是否包含該行。

+2

我認爲這是正確的答案。但是,請注意,如果將來升級Entity Framework,它可能會覆蓋對.tt文件的更改。 (除非我誤解了?) – rwalter

+0

總是想知道這個......我很想看到一個使用DbContext(它沒有定義'OnContextCreated')擴展生成的分類的答案。 – seebiscuit