Лучший способ обновить свойство JSON с ядром EF - PullRequest
0 голосов
/ 17 января 2019

Я решил сохранить некоторую информацию в виде объекта JSON в базе данных SQL Server, но мне не ясно, как мне обновить одно свойство этого объекта в столбце JSON, но не весь объект.

Это основное приложение asp.net. В качестве ORM я использую ядро ​​Entity Framework. Я хочу создать класс, который будет выглядеть следующим образом:

public class Person{
  public int Id {get;set;}
  public string FirstName {get;set;}
  public string  LastName {get;set;}  
  public string AdditionData {get;set;} //json object
}

И объект JSON в столбце «AdditionData» будет иметь следующий формат:

{
  phoneNumbers:["123456789","789456123"],
  groups:[{name:"g1", description:"blah"}, {name:"g2", description:"blah2"}]
}

Итак, теперь я хочу добавить новый PhoneNumber для некоторого человека, и подпись метода может выглядеть следующим образом:

void AddPhoneNumber(int personId, string phoneNumber);

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

первый: 1) найти человека по идентификатору с помощью EF 2) десериализовать весь объект AdditionData из строки 3) добавить новый номер телефона в список дополнения Data.PhoneNumbers 4) сериализовать объект AdditionData обратно в строку 5) обновить свойство person.AdditionData этой строкой 6) выполнить «saveChanges»

второй: используйте функцию JSON_MODIFY sql и выполните raw sql с параметром как то так:

context.Database.ExecuteSqlCommand("UPDATE Person
SET additionalData = JSON_MODIFY(additionalData,"append  $.phoneNumbers", @phoneNumber)
WHERE Id= @personId", personIdParam,phoneNumberParam);

Вопрос: Существует ли другой способ сделать это? Потому что те два способа, которые я описал, выглядят для меня не очень элегантно (особенно первый).

1 Ответ

0 голосов
/ 19 января 2019

Это невозможно с EF Core 2.2. Для такой функции есть предложение , но я бы не стал задерживать дыхание.

Если JSON, который вы храните, мал и / или обновления редки, я бы выбрал первый подход, поскольку изменения хранятся в контексте, и вам не нужна транзакция, и она лучше согласуется с общим дизайном EF. , Кроме того, это обеспечивает безопасность времени компиляции и упрощает рефакторинг / изменение. Проверьте эту тему - Как сохранить JSON в поле сущности с EF Core?

Если вам нужна производительность, чем определенно команда JSON_MODIFY sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...