【发布时间】:2017-03-16 12:56:49
【问题描述】:
瘦子:在将我的图形序列化为 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 将为空。相反,.Cities 急切地加载了数据,我不希望这样。
我最终尝试的是用这个来保留引用:
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.Objects;
这允许我的 JSON 序列化,但现在客户端必须处理像 [{$id:1, name:"SomeCity"}, {$ref:1}] 这样的数组。我想找到重建引用的方法,但决定最好完全避免循环引用。
【问题讨论】:
-
您是否尝试过在上下文中实际禁用延迟加载?
-
@DavidG 我没想到。我正在尝试禁用急切加载,而不是延迟加载。我知道在序列化过程中不会发生这种延迟加载,因为一旦对象从 DbContext 中出来,它们就会被完全填充。不过,我会调查一下,看看它是否有任何作用
-
显式指定某些内容并不会阻止进一步的延迟加载,它只会修改发送到数据库的初始查询。
-
@DavidG 正如预期的那样,使用
dbContext.Configuration.LazyLoadingEnabled = false禁用延迟加载并没有改变任何东西。此外,我们不处理延迟加载。急切的加载就是问题所在。我不希望它急于加载我没有提供特定包含的任何属性。
标签: entity-framework entity-framework-6 eager-loading