Я использую метод 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;