防止包含实体的子项的急切加载(停止自引用循环)

时间:2013-07-18 23:05:10

标签: asp.net asp.net-mvc entity-framework

我有两个具有多对多关系的实体。当我急切地使用Include()加载一个实体时,它会加载子项,并且还包括子项的子项。我不想要孙子。

我关闭了延迟加载:LazyLoadingEnabled = false;并且我忽略了自引用循环:

config.Formatters.JsonFormatter.SerializerSettings
    .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling
    .Ignore;

为了更好地解释事情:

public class A
{
    public int Id { get; set; }
    public ICollection<B> Bs { get; set; }
}

public class B
{
    public int Id { get; set; }
    public ICollection<A> As { get; set; }
}

我正在使用IUnitOfWork pattern(请参阅创建通用存储库),因此加载实体:

return unitOfWork.ARepository.Get(a => a.Id == Id, null, "Bs");

我找回了类似这样的JSON:

[
  {
    "Id": 1,
    "Bs": [
        {
          "Id": 1,
          "As": [
              {
                "Id": 2,
                "Bs": [

          ...

  },
  {
    "Id": 2,
    "Bs": [
        {
          "Id": 1,
          "As": [
              {
                "Id": 1,
                "Bs": [

         ...

传递自引用实体似乎真的很浪费。有什么方法可以阻止这种情况吗?

1 个答案:

答案 0 :(得分:0)

我将Newtonsoft.Json.JsonIgnoreAttribute添加到B类的As属性中。

public class B
{
    public int Id { get; set; }
    [JsonIgnore]    
    public ICollection<A> As { get; set; }
}

我认为这样做是安全的,因为我不会引用A类到B类。这种关系适用于EF Code First。

使用[JsonIgnore]使用Nuget(https://nuget.org/packages/newtonsoft.json/)安装它:

PM> Install-Package Newtonsoft.Json