Допустим, я запрашиваю базу данных и загружаю список элементов. Затем я открываю один из элементов в форме подробного просмотра и вместо повторного запроса элемента из базы данных создаю экземпляр элемента из источника данных в списке.
Есть ли способ обновить запись базы данных, не извлекая запись отдельного элемента?
Вот пример того, как я это делаю сейчас:
dataItem itemToUpdate = (from t in dataEntity.items
where t.id == id
select t).FirstOrDefault();
Затем после извлечения записи я обновляю некоторые значения в элементе и возвращаю запись:
itemToUpdate.itemstatus = newStatus;
dataEntity.SaveChanges();
Я думаю, есть лучший способ сделать это, есть идеи?
c#
entity-framework
Шейн Грант
источник
источник
Ответы:
Вам следует использовать метод Attach () .
Присоединение и отсоединение объектов
источник
Вы также можете использовать прямой SQL для базы данных, используя контекст хранилища данных. Пример:
По соображениям производительности вы можете захотеть передать переменные вместо одной жестко закодированной строки SQL. Это позволит SQL Server кэшировать запрос и повторно использовать его с параметрами. Пример:
ОБНОВЛЕНИЕ - для EF 6.0
источник
ExecuteStoreCommand
на самом деле это не способ EF, он просто используетDbConnection
содержимое внутриDbContext
для выполнения команды. Это не агностик базы данных, не говоря уже о агностике персистентности (например, в этом примере произойдет сбой, если OP переключится на XML).Код:
Результат TSQL:
Примечание:
Строка «IsModified = true» необходима, потому что при создании нового объекта ExampleEntity (только с заполненным свойством Id) все остальные свойства имеют значения по умолчанию (0, null и т. Д.). Если вы хотите обновить БД «значением по умолчанию», изменение не будет обнаружено структурой сущности, и тогда БД не будет обновлена.
Например:
не будет работать без строки «IsModified = true», поскольку свойство ExampleProperty уже имеет значение null, когда вы создавали пустой объект ExampleEntity, вам нужно сказать EF, что этот столбец должен быть обновлен, и это цель этой строки.
источник
Если поле
DataItem
has EF будет предварительно проверять (например, поля, не допускающие значения NULL), нам придется отключить эту проверку для этого контекста:В противном случае мы можем попытаться выполнить предварительную проверку и по-прежнему обновить только один столбец:
Предполагая,
dataEntity
что этоSystem.Data.Entity.DbContext
Вы можете проверить созданный запрос, добавив его в
DbContext
:источник
В этой статье, являющейся частью руководства Microsoft по началу работы, объясняются состояния сущностей и способы их выполнения:
Состояния добавления / присоединения и сущности
Посмотрите раздел «Присоединение существующей, но измененной сущности к контексту»
Теперь я собираюсь прочитать оставшуюся часть этих руководств.
источник
В EF Core это работает несколько иначе:
В EF Core может быть более быстрый способ сделать это, но следующее обеспечивает ОБНОВЛЕНИЕ без необходимости выполнять SELECT (проверено с EF Core 2 и JET в .NET Framework 4.6.2):
Убедитесь, что ваша модель не имеет свойств IsRequired
Затем используйте следующий шаблон (в VB.NET):
источник
Вообще говоря, если вы использовали Entity Framework для запроса всех элементов и сохранили объект сущности, вы можете обновить отдельные элементы в объекте сущности и вызвать его,
SaveChanges()
когда закончите. Например:Получение одного элемента, который вы хотите, не должно приводить к созданию нового запроса.
источник