EF Core 3.1. Странное поведение SetValues - PullRequest
1 голос
/ 16 апреля 2020

Я использую метод generi c для обновления данных объекта

// In repository implementation
public async Task Update<T>(int id, object model) where T: IEntity // (with Id)
{
   _dbContext.Attach(new T { Id = id }).CurrentValues.SetValues(model);
   await _dbContext.SaveChangesAsync();
}

Я обнаружил случай, когда данные не обновляются полностью. Я приведу пример.

Простая сущность БД:

class MyEntity : IEntity
{
   public int Id {get; set;}
   public string Name {get; set;}
   public bool Active {get; set;}
   public Guid EditorGuid {get; set;}
   public DateTime Modified {get; set;}
}

И мой простой бизнес logi c Метод:

public async Task ChangeActive(int id, bool active)
{
  var userGuid = _userService.GetCurrent().Guid;
  await _repository.Update<MyEntity>(id, new 
  {
    EditorGuid = userGuid,
    Active = active,
    Modified = DateTime.UtcNot
  });
}

Все запросы к базе данных вошел в консоль. При выполнении метода ChangeActive я вижу следующий sql запрос:

ОБНОВЛЕНИЕ publi c .my_entity SET editor_guid = @ p0, изменение = @ p1 WHERE id = @ p2;

SQL генерируется таким образом, что поле Active не обновляется. Хочу заметить, что в других случаях, когда в моем коде используется метод Update, эта проблема не возникает.

В чем может быть проблема?

UPDATE

Если я явно указываю значение, тогда sql запрос генерируется правильно

await _repository.Update<MyEntity>(id, new 
{
    EditorGuid = userGuid,
    Active = true, // <-- 
    Modified = DateTime.UtcNot
});

ОБНОВЛЕНИЕ publi c .my_entity SET active = @ p0, editor_guid = @ p1, изменено = @ p2 WHERE id = @ p3;

1 Ответ

3 голосов
/ 16 апреля 2020

Я нашел причину в одном из ответов на StackOverflow. Моя проблема заключается в том, что я пытаюсь установить значение bool в false, что эквивалентно значению по умолчанию (bool), которое EF Core будет игнорировать. Невозможно установить значение bool в false в методе обновления структуры сущности

...