У меня есть веб-приложение, использующее табличный компонент (DevExtreme DataGrids), который позволяет пользователям обновлять строки. Интерфейс отправляет обновления на сервер (.NET 9) через API следующим методом:
Код: Выделить всё
[HttpPut]
public async Task MyPutMethodAsync([FromForm] int key, [FromForm] string values)
- : представляет идентификатор набора данных в базе данных.
Код: Выделить всё
key - : строка JSON, содержащая только измененные свойства из строки.
Код: Выделить всё
values
Код: Выделить всё
const myRow = {id: 4, name: "Alex", age: 20, nationality: "American", height: 180}; //example row
//data gets modified in the table
myRow.age = 21;
myRow.height = 182;
myRow.nationality = null;
const key = myRow.id; //parameter key
const values = JSON.stringify({age: myRow.age, height: myRow.height, nationality: myRow.nationality}); //values parameter
console.log(values); //values as JSON stringПроблема:
В серверной части я использую JsonConvert.PopulateObject для заполнения нового объекта обновленными значениями:
Код: Выделить всё
var updatedRow = new MyRowClass(key); //creates a new object with the property id: key(4)
JsonConvert.PopulateObject(values, updatedRow);
Код: Выделить всё
updatedRow = {id: 4, name: null, age: 21, nationality: null, height: 182}
- было явно установлено значение null (что указывает на то, что пользователь удалил его).
Код: Выделить всё
nationalityДля - также имеет значение null, поскольку оно не было отправлено в значениях, то есть его не следует считать «измененным».
Код: Выделить всё
name
- было явно изменено (например, национальность = null`) или
Отсутствует в значениях (например, name = null, потому что оно не было включено в обновление)?
Я добавил флаг для каждого свойства, чтобы отслеживать, было ли оно установлено явно.
Я сокращу свой пример до одного свойства (национальности), чтобы сделать мой вопрос более информативным. ясно.
Код: Выделить всё
private string _nationality;
public bool NationalityChanged;
public string? Nationality
{
get => _nationality;
set
{
_nationality = value;
NationalityChanged = true;
}
}
- Это добавляет значительный шаблонный код.
- Обновление база данных с Entity Framework Core (EF Core) требует проверки if для каждого флага, что приводит к созданию многословного и потенциально неэффективного кода.
Код: Выделить всё
var myRowEntity = dbContext.MyTable.FirstOrDefault(row => row.id == myRow.id);
if (myRow.NationalityChanged)
{
myRowEntity.Nationality = myRow.Nationality
}
await dbContext.SaveChangesAsync()
Извлечение всего объекта из базы данных перед применением JsonConvert.PopulateObject может сработать, но это:
- Требует, чтобы DTO точно соответствовал модели объекта, что не идеально.
Код: Выделить всё
var myRowEntity = dbContext.MyTable.FirstOrDefault(row => row.id == myRow.id);
JsonConvert.PopulateObject(values, myRowEntity);
await dbContext.SaveChangesAsync();
Вопрос:
Есть ли лучший способ определить, какие свойства действительно изменились, избегая шаблонных и ручных операторов if? Можно ли улучшить или сделать мой текущий подход более общим?
Примечание. Я не могу изменить формат данных, отправляемых внешним интерфейсом.
Подробнее здесь: https://stackoverflow.com/questions/793 ... json-input
Мобильная версия