4

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

我有这样的实体类 -

public class Customer
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Quote> Quotes { get; set; }
}

public class Quote
{
    public Guid Id { get; set; }

    public int Order { get; set; }

    public string Status { get; set; }
}

要将补丁应用于Customer对象,我从数据上下文中查询源,然后应用补丁,如下所示 -

var entity = dataContext.Customers.Find(id);

patch.ApplyTo(entity);

dataContext.SaveChanges();

其中patch包括 -

[{ "op": "replace", "path": "/name", "value": "new name" }]

这适用于源对象的简单更新,当我想修补链接实体时会出现问题,请考虑以下补丁

[{ "op": "replace", "path": "/quotes/0/status", "value": "Closed" }]

我面临的第一个问题是——

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

我发现解决此问题的唯一方法是将更改从上下文中查询实体的方式称为 -

var entity = dataContext.Customers
    .Include(ent => ent.Quotes)
    .SingleOrDefault(ent => ent.Id == id);

entity.Quotes = entity.Quotes.OrderBy(ent => ent.Order).ToList);

这不太理想,因为我不喜欢查询数据来更新它的想法。我想知道是否有更清洁的方法。

4

1 回答 1

0

这是我登陆的解决方案 - https://gist.github.com/brendanmckenzie/a50f4eb7d5913372d01fef8e73c5dc9b

该代码处理创建和更新存储在 Entity Framework 中的实体。修补效果很好,因为 EF 跟踪 JsonPatch 应用的更改。

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

于 2019-03-26T00:48:44.763 回答