网络核心odata放置和修补嵌套的数据结构

时间:2018-09-26 17:27:15

标签: entity-framework asp.net-web-api asp.net-core odata

我一直在.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中其他所有内容的工作方式相比,这需要大量工作,而且只有嵌套更深的对象才会变得更加复杂。

我做错了什么,在这个问题上找不到太多资源吗?

1 个答案:

答案 0 :(得分:1)

似乎当前不支持此功能。我花了一些时间对此进行调查,但是唯一有用的资源是:http://odata.github.io/WebApi/#03-02-built-in-routing-conventions

对我来说,这意味着我们需要在主控制器中为相关实体编写多个补丁操作。上面有很多github问题-但是我在那里找不到任何有用的信息。

我已经就此问题here问了一个问题,其中一位贡献者证实了这一点。