Entity Framework включает неожиданного дочернего элемента, если ребенок готов вызвать в другом операторе - PullRequest
0 голосов
/ 29 мая 2020

Я использую 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. Однако результаты включают содержимое для Zone равно id при вызове /api/field/16/zone/15.

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

Кажется, что содержимое сохраняется, если дочерний элемент вызывается в другом месте. Я бы не хотел возвращать ребенка. Есть предложения?

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Вы можете добавить атрибуты [JsonIgnore] и [IgnoreDataMember] в свойство Zones в классе Field.

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

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

Подробнее см. this .

0 голосов
/ 30 мая 2020

Проблема связана с поведением отслеживания в Entity Framework Core. См. Эту ссылку для получения дополнительной информации: https://docs.microsoft.com/en-us/ef/core/querying/tracking

Использование функции AsNoTracking() решит мою проблему.

return Ok(_context.Field.AsNoTracking());
...