我一直在.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中其他所有内容的工作方式相比,这需要大量工作,而且只有嵌套更深的对象才会变得更加复杂。
我做错了什么,在这个问题上找不到太多资源吗?
答案 0 :(得分:1)
似乎当前不支持此功能。我花了一些时间对此进行调查,但是唯一有用的资源是:http://odata.github.io/WebApi/#03-02-built-in-routing-conventions
对我来说,这意味着我们需要在主控制器中为相关实体编写多个补丁操作。上面有很多github问题-但是我在那里找不到任何有用的信息。
我已经就此问题here问了一个问题,其中一位贡献者证实了这一点。