【问题标题】:net core odata put and patch nested data structuresnet core odata put 和 patch 嵌套数据结构
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2019-05-18
      • 2014-04-27
      • 2018-03-16
      • 2022-01-18
      相关资源
      最近更新 更多