Asp.net mvc 实体框架5';懒散的加载和小提琴手

Asp.net mvc 实体框架5';懒散的加载和小提琴手,asp.net-mvc,entity-framework,asp.net-web-api,lazy-loading,Asp.net Mvc,Entity Framework,Asp.net Web Api,Lazy Loading,我在理解实体框架5中的延迟加载时遇到问题。我理解在使用延迟加载时,直到请求时才会加载相关实体: “使用延迟加载时,初始查询只引入目标 但每当您访问导航属性时,另一个 对存储发出查询以加载相关实体。 ()” 我有一个包含两个类的ASP.NET Web API项目: public class Farm { public int FarmId { get; set; } public virtual ICollection<LandUnit> LandUnits { get

我在理解实体框架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设置为false,则得到:

JSON
    {}
        ...
    LandUnits=(null)

我是否误解了延迟加载的基本原理?在我看来,正在发生的事情与定义所述的情况相反。禁用延迟加载时,不会加载相关实体。启用延迟加载时,将加载相关实体。

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

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

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


在使用默认的JSON序列化程序时,您还应该注意这一点。

这只是表明您尚未请求任何LandUnits(如果您使用foreach之类的工具循环它们,它们将被加载)。因此,当使用延迟加载时,JSON对象是空的


禁用延迟加载时,LandUnits对象为空,因为LandUnits尚未加载,以后无法加载(尝试加载会引发错误)

感谢您的大力响应!因此,当LazyLoadingEnabled=true时,api调用首先获取场记录(发出第一个SQL查询),然后JSON序列化程序序列化结果以获取LandUnits记录(发出第二个SQL查询)?
JSON
    {}
        ...
    LandUnits=(null)