【问题标题】:Lazy loading in EF does not workEF 中的延迟加载不起作用
【发布时间】:2016-11-09 17:38:27
【问题描述】:

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

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 的构造函数中,我明确启用了延迟加载,这甚至是不必要的:

        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;

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

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

【问题讨论】:

  • 我认为因为你使用的是 .. cx.Houses.ToList();不要做一个 toList() 你不会得到数据
  • 不-这是官方教程,它也使用 tolist() entityframeworktutorial.net/EntityFramework4.3/…
  • 为了逗我开心,试试不带tolist
  • 如果没有 tolist 它也会加载所有实体。 :-(

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


【解决方案1】:

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

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

无论它们是如何加载的,因为我的 调试器 向我显示了所有名称属性。

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

【讨论】:

  • 啊好吧。好吧,如果那是真的,我很好。
  • 是的,这是真的。如果您想确认延迟加载是否按预期工作,请尝试 logging the database operations 以确认该关系仅在首次访问时被加载(查询)。
  • 好的,我试过了,我可以验证它是 100% 正确的。谢谢你回答了我的问题。
【解决方案2】:

如果我不使用 tolist():

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多