当我使用虚拟时,实体框架延迟加载是否自动工作?

时间:2015-06-23 13:52:45

标签: entity-framework

我想知道延迟加载在我使用虚拟时是否正常工作,或者我必须将其显式设置为true,如下所示:

DbContext.ContextOptions.LazyLoadingEnabled = true;

3 个答案:

答案 0 :(得分:3)

如果要启用延迟加载并在发生更改时让实体框架跟踪更改,则必须满足其他要求。您可以在link

中找到这些要求
  

要创建其中任何一个代理:

     
      
  • 自定义数据类必须声明public访问权限。
  •   
  • 自定义数据类不得 sealed(在Visual Basic中为NotInheritable

  •   
  • 自定义数据类不得 abstract(在Visual Basic中为MustInherit)。

  •   
  • 自定义数据类必须 publicprotected 构造函数,其中没有参数。如果您想要protected,请使用不带参数的Create构造函数   用于为POCO实体创建代理的方法。调用   Create方法不保证创建   代理:POCO类必须遵循其他要求   本主题中描述的。

  •   
  • 类无法实现 IEntityWithChangeTrackerIEntityWithRelationships接口,因为代理类实现了这些接口。

         

    ProxyCreationEnabled选项必须设置为true

  •   
     

对于延迟加载代理:

     
      
  • 每个导航属性必须声明为publicvirtual(在Visual Basic中为Overridable),而不是sealedNotOverridable in   Visual Basic)获取访问器。自定义数据类中定义的导航属性必须具有相应的导航属性   概念模型。
  •   
     

对于更改跟踪代理:

     
      
  • 映射到数据模型中实体类型的属性的每个属性必须 non-sealedNotOverridable在Visual中   基本),publicvirtual(在Visual Basic中为Overridable)获取   并设置访问者。
  •   
  • 一个导航属性,代表"很多"关系结束必须返回实现ICollection的类型,其中   T是关系另一端的对象类型。
  •   
  • 如果您希望与对象一起创建代理类型,则在创建新对象时,{strong>使用 DBSet<T>上的Create方法,而不是{{ 1}} operator。
  •   

答案 1 :(得分:0)

Entity Framework Loading Related Entities

  

延迟加载是在第一次访问引用实体/实体的属性时从数据库自动加载实体或实体集合的过程。 使用POCO实体类型时,通过创建派生代理类型的实例,然后覆盖虚拟属性以添加加载钩子来实现延迟加载。 [...]

要回答您的问题,只要它已启用,是的,虚拟导航属性将被延迟加载。

答案 2 :(得分:0)

默认

DbContext.ContextOptions.LazyLoadingEnabled

设置为 true ,因此,如果您不忘记虚拟,并且您没有将类标记为已密封,则可以正常工作。