首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JsonPatchDocument访问ICollection

JsonPatchDocument访问ICollection
EN

Stack Overflow用户
提问于 2017-06-15 16:08:56
回答 2查看 1.9K关注 0票数 7

我试图使用JsonPatchDocument替换列表中的一个对象,但是当我尝试使用正确的路径访问集合的一个成员时,会得到一个异常,下面是我的代码:

代码语言:javascript
复制
    var oppfour = new Operation<Application>("replace", "/comments/0", "", obj);

    var contractResolver = new DefaultContractResolver();
    var operations = new List<Operation<Application>>();

    operations.Add(operation);
    operations.Add(opptwo);
    operations.Add(oppthree);
    operations.Add(oppfour);

    var patchJson = new JsonPatchDocument<Application>(operations, contractResolver);

    try
    {
        patchJson.ApplyTo(app);
    }

我试图访问的数据模型如下所示:

代码语言:javascript
复制
public class Application: BaseEntity
{
    public virtual ICollection<Comment> Comments { get; set; }
}

这是一个例外:

Microsoft.AspNetCore.JsonPatch.Exceptions.JsonPatchException:路径段“0”指定的目标位置未找到。

如何设置在集合中某个特定点替换某物的路径?

EN

回答 2

Stack Overflow用户

发布于 2019-10-23 19:50:51

有点老问题,但是.JsonPatch要求它需要一个行列式路径来对元素进行操作。对于数组,这意味着指定成员要更新的序号(或"-“表示添加)。在封面下面,JsonPatchDocument实现了一个列表适配器,负责解析要从路径更新的项。为了确定是否应该应用列表适配器,它检查可以转换为IList的任何内容。

现在,使用EF,典型地将子集合实现为ICollection:

代码语言:javascript
复制
public virtual ICollection<ChildObject> Children { get; set; }

但是,如果我们看一下继承,我们会发现IList实现了ICollection,它实现了IEnumerable。下面是关于这个主题的快速阅读:https://medium.com/@kunaltandon.kt/ienumerable-vs-icollection-vs-ilist-vs-iqueryable-in-c-2101351453db

但归根结底,IList添加了JsonPatch所需的整数索引。所以没有办法在ICollection上得到序号。故事到此结束。

现在EF不会抱怨如果您将您的子集合实现为List,甚至IList -只要它支持ICollection,EF很高兴您可以应用您的JsonPatch而不存在任何问题。但是,需要考虑的一件事是,除非您专门发出有序的查询,否则您的结果应该被视为非确定性的。正因为如此,应用整数索引是一个谎言。

如果你做了很好的数据库设计,并把键和索引放在桌子上,那么很有可能这只是一个肮脏的善意的谎言,而不是一件可耻的事情。但这是你的决定。

票数 6
EN

Stack Overflow用户

发布于 2018-07-31 11:12:36

您发送的操作json中的路径不是url- path,它是应用该操作的目标实体的属性(就像jobject中的路径)。

取代:

代码语言:javascript
复制
{ "op": "replace", "path": /comments/0" "value": "..." }

通过以下方式:

代码语言:javascript
复制
{ "op": "replace", "path": "propertyname", "value": "propertyvalue" }

并通过url针对该实体,例如:

https://yourapiendpoint/comments/0

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44572225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档