我只需要更新put请求主体中提到的字段,当前问题是要更新的实体中未提及的所有值都设置为null 以下是我在通用存储库中的当前更新实现。
public virtual void Update(T entity)
{
Context.Attach(entity);
Context.Entry(entity).State = EntityState.Modified;
}
答案 0 :(得分:1)
您可以做的就是在更新实体之前获取它:
另一种方法是检查每个字段的状态,例如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));