【发布时间】:2018-10-05 16:36:32
【问题描述】:
我一直在 .net core 2.x web api 中使用 odata,所以效果很好,但现在我开始实现 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 中其他一切的工作方式相比,这是一项繁重的工作,而且只有更深的嵌套对象才会变得更加复杂。
我是不是做错了什么,我在这个问题上找不到太多资源?
【问题讨论】:
标签: entity-framework asp.net-web-api asp.net-core odata