Обновить запись без предварительной загрузки Entity Framework [duplicate]

Я только что прошел ту же проблему и нашел хорошее решение в руководствах PHP.

Я изменил всю свою кодировку файла на UTF8, а затем по умолчанию на мое соединение. Это решило все проблемы.

if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
   printf("Current character set: %s\n", $mysqli->character_set_name());
}

Просмотреть источник

83
задан SteveC 13 June 2013 в 16:00
поделиться

6 ответов

64
ответ дан CD.. 28 August 2018 в 06:13
поделиться

Вообще говоря, если вы использовали Entity Framework для запроса всех элементов и сохранили объект сущности, вы можете обновить отдельные элементы объекта сущности и вызвать SaveChanges() по завершении. Например:

var items = dataEntity.Include("items").items;
// For each one you want to change:
items.First(item => item.id == theIdYouWant).itemstatus = newStatus;
// After all changes:
dataEntity.SaveChanges();

Извлечение одного элемента, который вы хотите, не должен генерировать новый запрос.

0
ответ дан Andrew 28 August 2018 в 06:13
поделиться

Если DataItem имеет поля EF, которые будут предварительно проверяться (например, поля, не допускающие нулевое значение), нам придется отключить эту проверку для этого контекста:

DataItem itemToUpdate = new DataItem { Id = id, Itemstatus = newStatus };
dataEntity.Entry(itemToUpdate).Property(x => x.Itemstatus).IsModified = true;
dataEntity.Configuration.ValidateOnSaveEnabled = false;
dataEntity.SaveChanges();
//dataEntity.Configuration.ValidateOnSaveEnabled = true;

В противном случае мы можем попробовать выполнить предварительная валидация и по-прежнему обновлять только один столбец:

DataItem itemToUpdate = new DataItem
{
    Id = id,
    Itemstatus = newStatus,
    NonNullableColumn = "this value is disregarded - the db original will remain"
};
dataEntity.Entry(itemToUpdate).Property(x => x.Itemstatus).IsModified = true;
dataEntity.SaveChanges();

Предполагая, что dataEntity является System.Data.Entity.DbContext

Вы можете проверить запрос, сгенерированный добавлением этого параметра в DbContext:

/*dataEntity.*/Database.Log = m => System.Diagnostics.Debug.Write(m);
7
ответ дан Aske B. 28 August 2018 в 06:13
поделиться

Вы также можете использовать прямой SQL для базы данных, используя контекст хранилища данных. Пример:

dataEntity.ExecuteStoreCommand
   ("UPDATE items SET itemstatus = 'some status' WHERE id = 123 ");

По соображениям производительности вам может потребоваться передать переменные вместо одной жестко закодированной строки SQL. Это позволит SQL Server кэшировать запрос и повторно использовать его с параметрами. Пример:

dataEntity.ExecuteStoreCommand
   ("UPDATE items SET itemstatus = 'some status' WHERE id = {0}", new object[] { 123 });

UPDATE - для EF 6.0

dataEntity.Database.ExecuteSqlCommand
       ("UPDATE items SET itemstatus = 'some status' WHERE id = {0}", new object[] { 123 });
33
ответ дан barrypicker 28 August 2018 в 06:13
поделиться

В этой статье в качестве части «Начало работы» Microsoft объясняет состояния сущностей и как это сделать:

Добавить / присоединить и сущности

Посмотрите на раздел «Присоединение существующего, но измененного объекта к контексту»

Теперь я прочь прочитать остальные эти учебники.

2
ответ дан Simon_Weaver 28 August 2018 в 06:13
поделиться

Код:

ExampleEntity exampleEntity = dbcontext.ExampleEntities.Attach(new ExampleEntity { Id = 1 });
exampleEntity.ExampleProperty = "abc";
dbcontext.Entry<ExampleEntity>(exampleEntity).Property(ee => ee.ExampleProperty).IsModified = true;
dbcontext.Configuration.ValidateOnSaveEnabled = false;
dbcontext.SaveChanges();

Результат TSQL:

exec sp_executesql N'UPDATE [dbo].[ExampleEntities]
SET [ExampleProperty ] = @0
WHERE ([Id] = @1)
',N'@0 nvarchar(32),@1 bigint',@0='abc',@1=1

Примечание:

Строка IsModified = true необходима. когда вы создаете новый объект ExampleEntity (только с заполненным свойством Id), все остальные свойства имеют свои значения по умолчанию (0, null и т. д.). Если вы хотите обновить БД «значением по умолчанию», изменение не будет обнаружено каркасом сущности, а затем DB не будет обновляться.

В примере:

exampleEntity.ExampleProperty = null;

не будет работать без строки «IsModified = true», поскольку свойство ExampleProperty уже имеет значение null, когда вы создали пустой объект ExampleEntity, вам нужно сказать EF, что этот столбец должен быть обновлен, и это является целью этого линия.

5
ответ дан tecla 28 August 2018 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: