1

我在理解 Entity Framework 5 中的延迟加载时遇到问题。我知道在使用延迟加载时,相关实体在请求之前不会加载:

“使用延迟加载时,您的初始查询仅引入目标实体集。但每当您访问导航属性时,都会针对商店发出另一个查询以加载相关实体。(参考)”

我有一个包含两个类的 ASP.NET Web API 项目:

public class Farm
{
    public int FarmId { get; set; }
    public virtual ICollection<LandUnit> LandUnits { get; set; }
    ...
}
public class LandUnit
{
    public int LandUnitId { get; set; }
    ...
}

我设置了 LazyLoadingEnabled = true,并让我的 POCO 类符合指南(参考),但是当我使用脚手架创建 FarmController 并通过 fiddler 调用它时,它显示:

JSON
    {}
        ...
    LandUnits
        {}
            ...

如果我设置 LazyLoadingEnabled = false,那么我得到:

JSON
    {}
        ...
    LandUnits=(null)

我是否误解了延迟加载的基础知识?在我看来,正在发生的事情与定义所说的相反。关闭延迟加载时,不会加载相关实体。开启延迟加载时,会加载相关实体。

4

2 回答 2

2

这是预期的行为。当 JSON 序列化器开始序列化类型时,它将枚举LandUnits导航属性,这当然会从数据库调用该集合的延迟加载。

当您关闭延迟加载时,您的导航属性仍将设置为其默认值,因为实体框架不会生成任何代理类型。

我建议关闭延迟加载,并急切地(使用该Include方法)或明确加载(使用该Load方法)相关数据,以确保您不会无意中加载您不需要的数据。

使用默认 JSON 序列化程序时,您还应该注意循环依赖问题。

于 2012-12-06T00:31:48.777 回答
0

这只是表明您还没有请求任何 LandUnits(如果您使用类似 foreach 的东西循环它们,它们将被加载)。所以使用延迟加载时 JSON 对象为空。

关闭延迟加载时,LandUnits 对象为 null,因为 LandUnits 尚未加载并且以后无法加载(尝试这样做会引发错误)

于 2012-12-06T00:44:26.207 回答