使用实体框架核心仅编辑更改或提及的值

时间:2019-04-16 09:22:16

标签: asp.net-core entity-framework-core

我只需要更新put请求主体中提到的字段,当前问题是要更新的实体中未提及的所有值都设置为null 以下是我在通用存储库中的当前更新实现。

    public virtual void Update(T entity)
    {
        Context.Attach(entity);
        Context.Entry(entity).State = EntityState.Modified;
    }

3 个答案:

答案 0 :(得分:1)

您可以做的就是在更新实体之前获取它:

  1. 从上下文中获取实体
  2. 使用模型中的数据更新实体的字段。您可以使用Automapper之类的工具以干净的方式实现此目标。
  3. 然后在实体上调用您的Update方法

另一种方法是检查每个字段的状态,例如this answer

编辑更新点2。

希望有帮助。

答案 1 :(得分:1)

您需要两个不同的步骤。首先,您必须执行补丁操作。 Description here

public IActionResult PatchEntity(int id, [FromBody] JsonPatchDocument<Entity> patchdoc)
{
    var entity = dbContext.Entities.Find(e=>e.Id == id);
    patchdoc.ApplyTo(entity);
    dbContext.Update(entity);
    return Ok(entity);
}

这是一种对数据库(take a look at this question too)进行部分更新的方法:

public virtual void Update(params object[] keys, T entity)
{
    var current = Context.Entities.Find(keys);
    Context.Entry(entity).CurrentValues.SetValues(entity);
    Context.SaveChanges();
}

如果您不需要部分更新数据库记录,则可以:

public virtual void Update(T entity)
{
    Context.Update(entity); // entity is attached by default after select of entity
    Context.SaveChanges();
}

答案 2 :(得分:1)

最终解决了这个问题,甚至没有更改存储库 我只是在automapper配置文件中添加了一个配置,以忽略任何空值

CreateMap<TeamDto, Team>().ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));