Определение измененных свойств в частичных обновлениях с помощью ввода JSONC#

Место общения программистов C#
Ответить
Anonymous
 Определение измененных свойств в частичных обновлениях с помощью ввода JSON

Сообщение Anonymous »

Справочная информация:
У меня есть веб-приложение, использующее табличный компонент (DevExtreme DataGrids), который позволяет пользователям обновлять строки. Интерфейс отправляет обновления на сервер (.NET 9) через API следующим методом:

Код: Выделить всё

[HttpPut]
public async Task MyPutMethodAsync([FromForm] int key, [FromForm] string values)
  • : представляет идентификатор набора данных в базе данных.
  • : строка JSON, содержащая только измененные свойства из строки.
Пример сценария (упрощен для ясности) :

Код: Выделить всё

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}
Проблема в том, что:
  • Код: Выделить всё

    nationalityДля 
    было явно установлено значение null (что указывает на то, что пользователь удалил его).
  • также имеет значение null, поскольку оно не было отправлено в значениях, то есть его не следует считать «измененным».
Как я могу надежно определить, было ли свойство:
  • было явно изменено (например, национальность = 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()
Альтернативный подход[/b]
Извлечение всего объекта из базы данных перед применением JsonConvert.PopulateObject может сработать, но это:
  • Требует, чтобы DTO точно соответствовал модели объекта, что не идеально.
например

Код: Выделить всё

var myRowEntity = dbContext.MyTable.FirstOrDefault(row => row.id == myRow.id);
JsonConvert.PopulateObject(values, myRowEntity);
await dbContext.SaveChangesAsync();
Это будет работать, только если класс DTO MyRowClass и модель сущности имеют совпадающие свойства.
Вопрос:
Есть ли лучший способ определить, какие свойства действительно изменились, избегая шаблонных и ручных операторов if? Можно ли улучшить или сделать мой текущий подход более общим?
Примечание. Я не могу изменить формат данных, отправляемых внешним интерфейсом.

Подробнее здесь: https://stackoverflow.com/questions/793 ... json-input
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»