首页 > 解决方案 > 如果子项已准备好在另一个语句中调用,则实体框架包括意外子项

问题描述

我正在使用 ASP.NET Core 3.1.2、Pomelo.EntityFramework 3.1.1 与 MySQL 数据库链接。这是一个演示我的问题的最小示例。

定义了两个模型类。该模型Field包括多个区域:

public class Field
{
    [Key]
    public int Id { get; set; }
    public virtual ICollection<Zone> Zones { get; set; }

    public Field()
    {
        Zones = new HashSet<Zone>();
    }
}

public class Zone
{
    [Key]
    public int Id { get; set; }
    public int FieldId { get; set; }
    public virtual Field Field { get; set; }
}

然后创建一个 API 来获取区域的数据。

[Route("api/field/{field}/zone/{id}")]
[HttpGet]
public async Task<ActionResult<List<Field>>> GetZone(
    [FromRoute] int field,
    [FromRoute] int id)
{
    Zone Zone = await _context.Zone
                              .Where(m => m.FieldId == field && m.Id == id)
                              .SingleOrDefaultAsync();
    return Ok(_context.Field);
}

在演示代码中,我希望返回Field没有Zone. 但是,结果包括Zoneequals idif 调用的内容/api/field/16/zone/15

[
    {
        "zone": [],
        "id": 7
    },
    {
        "zone": [
            {
                "id": 15
            }
        ],
        "id": 16
    }
]

如果孩子在另一个地方被调用,内容似乎会被保留。我不想还孩子。有什么建议么?

标签: entity-frameworkasp.net-core

解决方案


您可以在类中的属性中添加 [JsonIgnore][IgnoreDataMember]属性。ZonesField

 public class Field
        {
            [Key]
            public int Id { get; set; }
            [JsonIgnore]
            [IgnoreDataMember]
            public virtual ICollection<Zone> Zones { get; set; }

            public Field()
            {
                Zones = new HashSet<Zone>();
            }
        }

更多详情,请参阅


推荐阅读