EF中的延迟加载不起作用

时间:2016-07-07 11:55:16

标签: .net entity-framework loading lazy-evaluation

我再次拥有以下两个类,这些类是由我的测试模型生成的:

public partial class House
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public House()
    {
        this.Persons = new HashSet<Person>();
    }

    public int id { get; set; }
    public string street { get; set; }
    public string city { get; set; }

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


public partial class Person
{
    public int id { get; set; }
    public string namen { get; set; }
    public int house { get; set; }

    public virtual House House1 { get; set; }
}

在我的DBContext的构造函数中,我明确启用了Lazy Loading,甚至不需要什么:

        this.Configuration.LazyLoadingEnabled = true;
        this.Configuration.ProxyCreationEnabled = true;

后来我打电话给房屋清单:

        YardEntities cx = new YardEntities();
        IList<House> hl = cx.Houses.ToList<House>();
        House h = hl[0];
        ///**************BREAKPOINT*******************///
        Person g = h.Persons.First<Person>();
        output = g.namen;

在我预期的标记断点之后,由于延迟加载,此时与房屋相关联的所有人都加载。我没有访问一个人,为什么要加载?但是它们已加载,因为我的调试器显示了所有名称属性。

有人可以解释这种行为吗?为什么懒人加载不起作用?

2 个答案:

答案 0 :(得分:3)

  

我没有访问过一个人,为什么要加载?

你是对的。除非您想访问,否则延迟加载不会加载任何关系。

  

然而,它们已加载,因为我的调试器向我显示了所有名称属性。

实际上,您的调试器希望访问它们,因此延迟加载将完成工作并从数据库中获取它们。

答案 1 :(得分:0)

如果我不使用tolist():

        DbSet<House> hl = cx.Houses;
        House h = hl.FirstOrDefault<House>();

h包含所有人,即使启用了延迟加载也是如此。我想Arvins的回答一定是真的。当我想看到它们时,调试器会加载所有值。 但有没有办法证明他的猜测?