Добавить запись в DbContext, возвращая ноль с запросом - PullRequest
0 голосов
/ 07 февраля 2019

Я провел исследование, но пока ничего не нашел.Благодарим вас за помощь.

Как видно из названия, я добавляю запись в свой DbContext, выполняя запрос, и если он возвращает нулевое значение, я создаю запись.В противном случае я изменяю это.

Мой вопрос: это хорошая практика или я не должен так поступать?Код выглядит следующим образом:

var desiredEntity = MyDbContext.SingleOrDefault(x => x.Name == "Rob");

if (desiredEntity == null)
  { desiredEntity = new DbSetOfEntity()... //create if doesn't exists }
else
{ desiredEntity.ValueToModify == 3; }

MyDbContext.SaveChanges()

В чем разница между этим и явным созданием объекта и добавлением его с помощью метода DbContext.Add ()?

Редактировать: Аналогичный вопрос здесь задается , но я не хочу использовать метод AddOrUpdate или Attach и изменять состояние сущностей вручную.Я просто хочу знать, не является ли мой подход проблематичным и каковы различия при использовании традиционного подхода .Add (myEntity).

1 Ответ

0 голосов
/ 08 февраля 2019

AddOrUpdate() проверяет запись на существование с помощью EntityKey.Поэтому, если x.Name, который вы проверяете, не является ключевым - ваш подход верен.

Также, поскольку у вас есть только значение имени в качестве входного параметра («Роб»), вам придется запрашивать запись из контекста, и вы будете прикреплять ее.Так что тогда вы можете просто изменить его, как вам нужно, и изменения будут отслеживаться автоматически.В качестве альтернативы, создайте его, если он не существует, и позвоните Add().

. Учитывая вышеизложенное, ваш подход в порядке и будет работать, и я не вижу никаких проблем с ним.

Вкл.с другой стороны, ваш код должен быть максимально простым и элегантным.Это важно для поддержки вашего кода вами или вашими товарищами по команде.Вот почему использование таких конструкций, как AddOrUpdate или других встроенных элементов, является хорошей практикой.Но не закон.

PS Я не смотрю на код вроде { desiredEntity.ValueToModify == 3; }.Это потенциально плохая практика, так как 3, возможно, следует передать вашему методу в качестве параметра.

...