【问题标题】:How can I update entity with its children? Patch method doesn't work如何更新实体及其子级?补丁方法不起作用
【发布时间】:2015-07-24 14:10:32
【问题描述】:

我必须使用其子列表更新我的实体,如下所示:

 public class Entity1 
 { 
    int Id{get;set;} 
    ObservableCollection<Child1> ChildrenList {get;set;} 
    string Name{get;set;}
 }

public class Child1
{
    string Nome{get;set;}
    string Cognome {get;set;}
}

我是这样实现patch方法的:

[AcceptVerbs("PATCH", "MERGE")]
public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<Entity1> entityDelta)
{

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            var entity = await Context.Entity1.FindAsync(key);
            if (entity == null)
            {
                return NotFound();
            }
            entityDelta.Patch(entity);

            try
            {
                await Context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                return NotFound();
            }
            return Updated(entity);
}

但是当我尝试以这种方式从提琴手中调用它时:

Url: http://localhost/odata4/Entity1(1)/  with patch request

Request Headers: Content-Type: application/json

Request Body: 
{
Name: "pippo2",
ChildrenList:[{
Nome: "Test",
Cognome: "Pippo"
}]
}

它在 Model.isValid 属性中给出错误并指定返回此错误:

无法将 PATCH 应用于实体上的导航属性“ChildrenList” 输入“Entity1”。

我该如何解决?补丁方法是正确使用的方法吗?

【问题讨论】:

    标签: odata asp.net-web-api-odata odata-v4


    【解决方案1】:

    OData V4 spec 表示更新实体:

    实体不得包含相关实体作为内联内容。它可能包含导航属性的绑定信息。对于单值导航属性,这将替换关系。对于集合值导航属性,这会增加关系。

    所以,你可以使用:

    1. 更新孩子:

      补丁/放置:~/Child1s(...)

    2. 更新父级

      补丁/放置:~/Entity1s(...)

    3. 更新父子关系:

      PATCH/PUT ~/Entity1s(...)/ChildrenList/$ref

    带有实体参考链接的内容。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多