EF Core 3.1 перезаписывает все поля пустыми значениями из DTO, когда я отправляю запрос на обновление HTTP PUT в мой API - PullRequest
0 голосов
/ 20 февраля 2020

Контекст

У меня настроен API с операциями CRUD - у меня проблемы с конечной точкой HTTP PUT, которую я использую для обновления сущности. Я только хочу, чтобы API мог обновлять некоторые поля для сущности, поэтому я использую объект передачи данных (DTO) и использую AutoMapper, чтобы сопоставить его с моделью домена для Entity Framework Core (EF Core). ) обновить сущность в базе данных. При использовании AutoMapper для отображения из DTO в модель домена, нулевые значения будут добавлены, а затем перезаписать эти значения в базе данных. Как я могу предотвратить это?

Код

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. Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 20 февраля 2020

This

 _context.Entry(player).State = EntityState.Modified;

Помечает все свойства как измененные. Вместо этого отметьте только те, которые вы хотите обновить. Например,

 _context.Entry(player).Property(p => p.Name).IsModified = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...