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

3
使用EF 6时,Lazy Loading Enabled 在模型中被设置为True。以下是我问题的一个示例:
var agent = context.AgentDetail.Where(a => a.Agent.GroupCode == "1234");

运行这个将返回5个结果。如果之后我运行(仅用于测试目的)
var code = agent.FirstOrDefault().Agent.GroupCode;

我遇到了空引用异常,因为Agent为空。

以下是我的实体:

    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个结果呢?我无法弄清楚出了什么问题,任何帮助将不胜感激。


1
在实体 Agent 中,用于惰性加载的实体应该是虚拟的。 - BWA
@BWA 刚刚添加了它们。 - erictrigo
@Eldho 是的,我已经尝试在几乎所有地方添加了 Include(a => a.Agent)。但是没有任何改变。 - erictrigo
似乎与延迟加载或立即加载无关,大多数情况下也与代理和代理详细信息无关。 - Eldho
你确定第一条语句返回了5个结果吗?按照你写的方式,它不应该返回任何内容,因为它只是一个IQueryable。你的第一条语句没有调用.ToList()、.First()或.FirstOrDefault()。 - trevorc
显示剩余3条评论
2个回答

0

来自创建POCO代理的要求

  1. 必须使用公共访问声明自定义数据类。
  2. 自定义数据类不能被密封。
  3. 自定义数据类不能是抽象的。
  4. 自定义数据类必须有一个公共或受保护的构造函数,该构造函数不带参数。如果您想要使用不带参数的受保护构造函数来为POCO实体创建代理,则使用受保护的构造函数。调用CreateObject方法并不保证创建代理:POCO类必须遵循本主题中描述的其他要求。
  5. 该类不能实现IEntityWithChangeTracker或IEntityWithRelationships接口,因为代理类已经实现了这些接口。
  6. 必须将ProxyCreationEnabled选项设置为true。
  7. 每个导航属性必须声明为public、virtual(在Visual Basic中为Overridable)和未密封的get访问器。在自定义数据类中定义的导航属性必须在概念模型中具有相应的导航属性。有关详细信息,请参阅加载相关的POCO实体。

请检查您的类中的这些点。在您粘贴的代码中,AgentDetail 没有公共/受保护的构造函数。


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

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

请您能否详细说明一下? - erictrigo
EF可以从导航属性中推断出简单的关系。 - BWA
@Antrim 我的意思是在代理商详情表中加入[ForeignKey("你的对象")]。 - Pavvy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接