当我向API发送HTTP PUT更新请求时,EF Core 3.1正在用DTO中的空值覆盖所有字段



上下文

我有一个使用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;

最新更新