JsonPatchDocument на сложный отслеживаемый объект Entity Framework - PullRequest
4 голосов
/ 14 марта 2019

Я пытаюсь использовать исправления 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', не найдено

Единственный способ обойти это, как я обнаружил, состоит в том, чтобы вызвать альтернативный способ запроса сущности из контекста в -

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

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

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

1 Ответ

0 голосов
/ 26 марта 2019

Это решение, на котором я приземлился - https://gist.github.com/brendanmckenzie/a50f4eb7d5913372d01fef8e73c5dc9b

Код обрабатывает создание и обновление сущностей, хранящихся в Entity Framework. Исправление работает хорошо, так как EF отслеживает изменения, примененные JsonPatch.

Там есть некоторый дополнительный код, который немного запутан (NormaliseOperations), который помогает работать со связанными объектами; например, если Quote ссылается на другую сущность.

...