我试图使用JsonPatchDocument替换列表中的一个对象,但是当我尝试使用正确的路径访问集合的一个成员时,会得到一个异常,下面是我的代码:
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);
}我试图访问的数据模型如下所示:
public class Application: BaseEntity
{
public virtual ICollection<Comment> Comments { get; set; }
}这是一个例外:
Microsoft.AspNetCore.JsonPatch.Exceptions.JsonPatchException:路径段“0”指定的目标位置未找到。
如何设置在集合中某个特定点替换某物的路径?
发布于 2019-10-23 19:50:51
有点老问题,但是.JsonPatch要求它需要一个行列式路径来对元素进行操作。对于数组,这意味着指定成员要更新的序号(或"-“表示添加)。在封面下面,JsonPatchDocument实现了一个列表适配器,负责解析要从路径更新的项。为了确定是否应该应用列表适配器,它检查可以转换为IList的任何内容。
现在,使用EF,典型地将子集合实现为ICollection:
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而不存在任何问题。但是,需要考虑的一件事是,除非您专门发出有序的查询,否则您的结果应该被视为非确定性的。正因为如此,应用整数索引是一个谎言。
如果你做了很好的数据库设计,并把键和索引放在桌子上,那么很有可能这只是一个肮脏的善意的谎言,而不是一件可耻的事情。但这是你的决定。
发布于 2018-07-31 11:12:36
您发送的操作json中的路径不是url- path,它是应用该操作的目标实体的属性(就像jobject中的路径)。
取代:
{ "op": "replace", "path": /comments/0" "value": "..." }通过以下方式:
{ "op": "replace", "path": "propertyname", "value": "propertyvalue" }并通过url针对该实体,例如:
https://stackoverflow.com/questions/44572225
复制相似问题