У кого-нибудь есть предложения по наиболее эффективному способу реализации логики «обновить строку, если она существует, иначе вставка» с использованием Entity Framework?
c#
entity-framework
Джонатан Вуд
источник
источник
Ответы:
Если вы работаете с прикрепленным объектом (объект загружен из того же экземпляра контекста), вы можете просто использовать:
Если вы можете использовать какие-либо знания о ключе объекта, вы можете использовать что-то вроде этого:
Если вы не можете определить наличие объекта по его идентификатору, вы должны выполнить поисковый запрос:
источник
using
блок. Можно ли оставить контекст в памяти на некоторое время? Например, при жизни формы Windows? Я обычно пытаюсь очистить объекты базы данных, чтобы обеспечить минимальную нагрузку на базу данных. Нет ли проблем в ожидании уничтожения моего контекста EF?Начиная с Entity Framework 4.3,
AddOrUpdate
в пространстве имен есть методSystem.Data.Entity.Migrations
:который по документу :
Ответить на комментарий @ Smashing1978 , я вставлю соответствующие части по ссылке, предоставленной @Colin
Тем не менее, у меня есть ситуация, когда я извлекаю данные из внешнего сервиса и вставляю или обновляю существующие значения по первичному ключу (а мои локальные данные для потребителей доступны только для чтения) - использую
AddOrUpdate
в производстве уже более 6 месяцев и так Куда нет проблем.источник
Магия случается при звонке
SaveChanges()
и зависит от токаEntityState
. Если у объекта естьEntityState.Added
, он будет добавлен в базу данных, если у него естьEntityState.Modified
, он будет обновлен в базе данных. Таким образом, вы можете реализоватьInsertOrUpdate()
метод следующим образом:Подробнее о EntityState
Если вы не можете проверить,
Id = 0
является ли это новый объект или нет, проверьте ответ Ладислава Мрнки .источник
Если вы знаете, что используете тот же контекст и не отсоединяете никаких сущностей, вы можете сделать общую версию, например, такую:
db
Конечно, это может быть поле класса, или метод может быть сделан статическим и расширением, но это основы.источник
Ответ Ладислава был близок, но мне пришлось внести несколько изменений, чтобы заставить его работать в EF6 (сначала база данных). Я расширил свой контекст данных с помощью моего метода AddOrUpdate, и до сих пор он, кажется, хорошо работает с отсоединенными объектами:
источник
По моему мнению, стоит сказать, что с недавно выпущенными EntityGraphOperations для Entity Framework Code First вы можете уберечь себя от написания некоторых повторяющихся кодов для определения состояний всех сущностей в графе. Я автор этого продукта. И я опубликовал его в github , code-project ( включает пошаговую демонстрацию и пример проекта готов к загрузке) и nuget .
Он автоматически установит состояние объектов на
Added
илиModified
. И вы вручную выберете, какие объекты должны быть удалены, если они больше не существуют.Пример:
Допустим, у меня есть
Person
объект.Person
может иметь много телефонов, документ и может иметь супруга.Я хочу определить состояние всех объектов, которые включены в график.
Также, как вы знаете, уникальные свойства ключа могут играть роль при определении состояния объекта Phone. Для таких специальных целей у нас есть
ExtendedEntityTypeConfiguration<>
класс, который наследуется отEntityTypeConfiguration<>
. Если мы хотим использовать такие специальные конфигурации, мы должны наследовать наши классы отображения отExtendedEntityTypeConfiguration<>
, а неEntityTypeConfiguration<>
. Например:Вот и все.
источник
Вставьте еще, обновите оба
источник
Проверьте существующую строку с Any.
источник
Альтернатива для @LadislavMrnka ответа. Это если для Entity Framework 6.2.0.
Если у вас есть определенный
DbSet
элемент, который необходимо обновить или создать:Однако это также может быть использовано для универсального
DbSet
с одним первичным ключом или составным первичным ключом.источник
Исправлено
источник