Я использовал odata в .net core 2.x web api, и поэтому он работал отлично, но теперь я начинаю реализовывать конечные точки PUT / PATCH и начинаю сталкиваться с проблемами с вложенными структурами.В простой настройке заказа / элемента, как показано ниже, мне нужно вручную обрабатывать удаление и добавление элементов в заказ, если они изменились.Я не могу получить odata для отслеживания вложенных изменений.
public class Item
{
[Key]
public int Id { get; set; }
public int OrderId { get; set; }
public Order Order { get; set; }
}
public class Order
{
[Key]
public int Id { get; set; }
public virtual ICollection<Item> Items { get; set; }
}
И мой сервис, который обновляет порядок:
public void Update(Order order)
{
using (var trans = DbContext.Database.BeginTransaction())
{
try
{
var existingItems = DbContext.Items.Where(t => t.OrderId == order.Id);
var deleteItems = existingItems.Where(t => order.Items.Count() == 0 || !order.Items.Any(c => c.OrderId == t.OrderId));
var addItems = order.Items.Where(t => !existingItems.Any(c => c.OrderId == t.OrderId));
addItems.ToList().ForEach(a => a.OrderId = order.Id);
DbContext.RemoveRange(deleteItems);
DbContext.AddRange(addItems);
DbContext.SaveChanges();
DbContext.Entry(order).State = EntityState.Modified;
DbContext.SaveChanges();
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
}
}
По сравнению с тем, как все остальное в Odata работает, это многоработать, и становится намного сложнее с более глубокими вложенными объектами.
Я делаю что-то не так, не могу найти много ресурсов по этому вопросу?