我只明确指定了急切的加载导航属性

时间:2017-03-16 12:56:50

标签: entity-framework entity-framework-6 eager-loading

瘦:在将图表序列化为JSON时,由于循环引用问题,我试图禁用导航属性的急切加载。

我有这些课程:

public class Province 
{
    public ICollection<City> Cities { get; set; }
}

public class City 
{
    public Province Province { get; set; }
}

当我想要获得一系列城市时,我提供了以下内容:

set.Include(e => e.City.Province);

最终发生的事情是它按照预期加载到省份的所有东西,但它也加载了所有省份的城市。这导致序列化期间的循环引用,因为在我的基本集合中返回的相同的引用也存在于各省。

我对显式加载的期望是City.Province会有引用,但City.Province.Cities将为null。相反,.Cities渴望加载数据,我不希望这样。

我最终尝试的是保留引用:

config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling =
    Newtonsoft.Json.PreserveReferencesHandling.Objects;

这允许我的JSON序列化,但现在客户端必须处理像[{$id:1, name:"SomeCity"}, {$ref:1}]这样的数组。我想找到重建参考文献的方法,但我认为最好完全避免使用循环引用。

1 个答案:

答案 0 :(得分:0)

实体框架已设置,以便所有引用自动相互了解。你可以尝试一些事情。

  1. 使用.AsNoTracking()(在.ToList()之前)。它最终可能会加载所有级别的所有数据,但我认为它会删除循环引用。

  2. 创建存储您想要的关系并以这种方式映射到它的Dtos / Models。

  3. 在序列化之前,您必须遍历子项并直接将父引用设置为null。然后它将打破循环数据。