Я только что прошел ту же проблему и нашел хорошее решение в руководствах 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());
}
Вообще говоря, если вы использовали 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();
Извлечение одного элемента, который вы хотите, не должен генерировать новый запрос.
Если 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);
Вы также можете использовать прямой 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 });
В этой статье в качестве части «Начало работы» Microsoft объясняет состояния сущностей и как это сделать:
Добавить / присоединить и сущности
Посмотрите на раздел «Присоединение существующего, но измененного объекта к контексту»
Теперь я прочь прочитать остальные эти учебники.
Код:
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, что этот столбец должен быть обновлен, и это является целью этого линия.