上下文
我有一个使用CRUD操作设置的API——我在使用HTTP PUT端点更新实体时遇到了问题。我只希望API能够更新实体的一些字段,因此我使用数据传输对象(DTO(,并使用AutoMapper将其映射到实体框架核心(EF核心(的域模型,以更新数据库中的实体。当使用AutoMapper从DTO映射到域模型时,将添加null值,然后覆盖数据库中的这些值。我该如何防止这种情况发生?
代码
PlayerController.cs
[HttpPut("{id}")]
public async Task<IActionResult> PutPlayer(Guid id, PlayerUpdateDto playerUpdateDto)
{
Player player = _mapper.Map<Player>(playerUpdateDto);
_context.Entry(player).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!PlayerExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return Ok(player);
}
Player.cs
public class Player
{
[Key]
public Guid Id { get; set; }
[Required]
public string Name { get; set; }
public double Rating { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
public ICollection<Match> MatchesOne { get; set; }
public ICollection<Match> MatchesTwo { get; set; }
public ICollection<Match> MatchesThree { get; set; }
public ICollection<Match> MatchesFour { get; set; }
}
PlayerUpdateDto.cs
public class PlayerUpdateDto
{
public Guid Id { get; set; }
public string Name { get; set; }
}
Player评级、创建和更新的属性都设置为空值,但我希望它们保持不变,因为它们不在DTO中。如有任何帮助,我们将不胜感激!
此
_context.Entry(player).State = EntityState.Modified;
将所有特性标记为已修改。相反,只标记要更新的。例如
_context.Entry(player).Property(p => p.Name).IsModified = true;