2012-10-13 119 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