EF6,延迟加载未按预期工作

Posted

技术标签:

【中文标题】EF6,延迟加载未按预期工作【英文标题】:EF6, lazy loading not working as expected 【发布时间】:2017-06-23 08:54:42 【问题描述】:

使用 EF 6,Lazy Loading Enabled 在模型中设置为 True。这是我的问题的一个例子:

var agent = context.AgentDetail.Where(a => a.Agent.GroupCode == "1234");

运行将返回 5 个结果。如果在那之后我运行(仅用于测试目的)

var code = agent.FirstOrDefault().Agent.GroupCode;

我得到一个空引用异常,因为Agentnull

这是我的实体:

    public partial class AgentDetail : Entity<int>
    
        public Nullable<System.DateTime> Date  get; set; 
        public string Name  get; set; 
        public decimal Balance  get; set; 
        ...

        public virtual Agent Agent  get; set; 
    

    public partial class Agent : Entity<int>
    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Agent()
        
            this.AgentAspNetUsers = new HashSet<AgentAspNetUsers>();
            this.AgentDetail = new HashSet<AgentDetail>();
        

        public string GroupCode  get; set; 
        ...

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<AgentAspNetUsers> AgentAspNetUsers  get; set; 
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<AgentDetail> AgentDetail  get; set; 
    

那么,它怎么会在第一个查询中给我 5 个结果呢?我无法弄清楚这里出了什么问题,任何帮助将不胜感激。

【问题讨论】:

显示,你的实体,用于延迟加载实体代理应该是虚拟的。 @BWA 刚刚添加。 看看this和this也许对你有帮助 @BWA 在我发布问题之前已经看过那些,我也在使用数据库优先。 它是否在进行预加载? 【参考方案1】:

尝试定义实体之间的关系。如果您的延迟加载已启用,它应该可以工作。

【讨论】:

您能详细说明一下吗? EF 可以从导航属性中推导出的简单关系 @Antrim 我的意思是将 [ForeignKey("your object")] 添加到代理详细信息表中。【参考方案2】:

来自Requirements for Creating POCO Proxies

    自定义数据类必须声明为具有公共访问权限。 不得密封自定义数据类 自定义数据类不能是抽象的 自定义数据类必须具有不带参数的公共或受保护构造函数。如果希望使用 CreateObject 方法为 POCO 实体创建代理,请使用不带参数的受保护构造函数。调用 CreateObject 方法并不能保证代理的创建:POCO 类必须遵循本主题中描述的其他要求。 该类无法实现 IEntityWithChangeTracker 或 IEntityWithRelationships 接口,因为代理类实现了这些接口。 ProxyCreationEnabled 选项必须设置为 true。 每个导航属性都必须声明为公共、虚拟(在 Visual Basic 中可重写)和非密封(在 Visual Basic 中为 NotOverridable)获取访问器。自定义数据类中定义的导航属性必须在概念模型中具有相应的导航属性。有关详细信息,请参阅加载相关 POCO 实体。

在您的课程中检查这一点。在您粘贴的代码中 AgentDetail 没有公共/受保护的构造函数。

【讨论】:

具有复杂 getter 的属性(无法在 LinqToSql 中翻译)是否会阻止 POCO 代理和 LazyLoading?

以上是关于EF6,延迟加载未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

React 延迟加载/无限滚动解决方案

动态脚本标签加载未按预期工作

WebDriverWait 未按预期工作

HttpURLConnection setReadTimeOut()未按预期工作

反应 onLoad img 事件未按预期工作

我的网站主页内容未按顺序加载