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

时间:2017-02-06 12:05:09

标签: c# .net entity-framework linq entity-framework-6

使用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个结果呢?我无法弄清楚这里有什么问题,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

来自Requirements for Creating POCO Proxies

  1. 必须使用公共访问权限声明自定义数据类。
  2. 不得密封自定义数据类
  3. 自定义数据类不得为抽象
  4. 自定义数据类必须具有没有参数的公共或受保护构造函数。如果希望使用CreateObject方法为POCO实体创建代理,请使用不带参数的受保护构造函数。调用CreateObject方法并不能保证代理的创建:POCO类必须遵循本主题中描述的其他要求。
  5. 该类无法实现IEntityWithChangeTracker或IEntityWithRelationships接口,因为代理类实现了这些接口。
  6. 必须将ProxyCreationEnabled选项设置为true。
  7. 每个导航属性必须声明为public,virtual(在Visual Basic中为Overridable),而不是密封(在Visual Basic中为NotOverridable)get accessor。自定义数据类中定义的导航属性必须在概念模型中具有相应的导航属性。有关更多信息,请参阅加载相关POCO实体。
  8. 在课程上检查这一点。在您粘贴的代码中AgentDetail没有公共/受保护的构造函数。