JsonPatchDocument в сложный отслеживаемый объект Entity Framework

Я пытаюсь использовать исправления Json для обновления объектов, хранящихся в контексте данных Entity Framework.

У меня есть такие классы сущностей -

public class Customer
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Quote> Quotes { get; set; }
}

public class Quote
{
    public Guid Id { get; set; }

    public int Order { get; set; }

    public string Status { get; set; }
}

Чтобы применить патч к объекту Customer, я запрашиваю источник из контекста данных, затем применяю патч, например:

var entity = dataContext.Customers.Find(id);

patch.ApplyTo(entity);

dataContext.SaveChanges();

Где patch состоит из -

[{ "op": "replace", "path": "/name", "value": "new name" }]

Это отлично работает для простых обновлений исходного объекта, проблема возникает, когда я хочу исправить связанные объекты, рассмотрите следующий патч

[{ "op": "replace", "path": "/quotes/0/status", "value": "Closed" }]

Первая проблема, с которой я столкнулся, это -

Целевое местоположение, указанное сегментом пути «0», не найдено

Единственный способ обойти это, который я нашел, - это вызвать alter способ запроса объекта из контекста на -

var entity = dataContext.Customers
    .Include(ent => ent.Quotes)
    .SingleOrDefault(ent => ent.Id == id);

entity.Quotes = entity.Quotes.OrderBy(ent => ent.Order).ToList);

Что далеко не идеально, так как мне не нравится идея запрашивать данные для их обновления. Мне интересно, есть ли более чистый подход к этому.


person Brendan    schedule 14.03.2019    source источник
comment
После долгих поисков этот подход оказался наиболее разумным.   -  person Brendan    schedule 26.03.2019
comment
Обратите внимание, что использование OrderBy основано на том, что Quotes поддерживаются List‹›, а не HashSet‹›.   -  person Aaron Queenan    schedule 20.11.2020


Ответы (1)