C# JsonPatchDocument到复杂实体框架跟踪对象上

C# JsonPatchDocument到复杂实体框架跟踪对象上,c#,entity-framework,json-patch,C#,Entity Framework,Json Patch,我试图使用Json补丁来更新实体框架数据上下文中存储的实体 我有这样的实体类- 公共类客户 { 公共Guid Id{get;set;} 公共字符串名称{get;set;} 公共虚拟ICollection引号{get;set;} } 公开课报价 { 公共Guid Id{get;set;} 公共整数顺序{get;set;} 公共字符串状态{get;set;} } 要将补丁应用于客户对象,我从数据上下文查询源,然后应用补丁,如下所示- var entity=dataContext.Customers

我试图使用Json补丁来更新实体框架数据上下文中存储的实体

我有这样的实体类-

公共类客户
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection引号{get;set;}
}
公开课报价
{
公共Guid Id{get;set;}
公共整数顺序{get;set;}
公共字符串状态{get;set;}
}
要将补丁应用于
客户
对象,我从数据上下文查询源,然后应用补丁,如下所示-

var entity=dataContext.Customers.Find(id);
patch.ApplyTo(实体);
dataContext.SaveChanges();
其中
补丁
包括-

[{ "op": "replace", "path": "/name", "value": "new name" }]
<>这对于源对象的简单更新很有效,当我想修补链接实体时出现问题,考虑下面的补丁< /P>
[{ "op": "replace", "path": "/quotes/0/status", "value": "Closed" }]
我面临的第一个问题是-

找不到路径段“0”指定的目标位置

我发现的唯一解决方法是调用alter,改变从上下文查询实体的方式-

var entity=dataContext.Customers
.Include(ent=>ent.Quotes)
.SingleOrDefault(ent=>ent.Id==Id);
entity.Quotes=entity.Quotes.OrderBy(ent=>ent.Order.ToList);

这不太理想,因为我不喜欢通过查询数据来更新它。我想知道是否有一种更干净的方法来解决这个问题。

这就是我找到的解决方案-

代码处理创建和更新实体框架中存储的实体。补丁可以很好地工作,EF可以跟踪JsonPatch应用的更改


还有一些额外的代码有点凌乱(
NormaliseOperations
),有助于处理链接实体;i、 例如,如果
Quote
引用了另一个实体。

经过大量搜索后,这种方法似乎是最合理的。请注意,OrderBy的使用依赖于由列表而不是哈希集支持的引号。