#c# #entity-framework-6 #insert-update #upsert
#c# #entity-framework-6 #вставить-обновить #ввод
Вопрос:
У меня есть несколько объектов с подмножеством полей из таблицы. В некоторых случаях я должен обновить только одно поле. Как правильно это сделать в Entity Framework 6.0? Следующий код выдает ошибку из-за ограничений базы данных, потому что AddOrUpdate
пытается заменить все поля, но FieldName
с пустыми значениями.
public static TheField Set(TheField f)
{
using (var dbContext = new MyModel())
{
dbContext.MyEntity.AddOrUpdate(new MyEntity()
{
ForeignId = f.ForeignId,
FieldName = f.FieldName,
});
dbContext.SaveChanges();
return f;
}
}
Было бы неплохо иметь расширение
public static class MyExtension
{
public static void AddOrUpdateSchema<TEntity, TKey>(this IDbSet<TEntity> set, TKey id, string schema,
params TEntity[] entities) where TEntity : class
{
// ...
}
}
а затем использовать его
public class MyEntity
{
[Key]
public int ForeignId { get; set; }
[UpdateSchema("Schema")]
public string FieldName { get; set; }
// ...
}
public class MyEntityView
{
public int ForeignId { get; set; }
public string FieldName { get; set; }
public static MyEntityView Set(MyEntityView f)
{
using (var dbContext = new MyModel())
{
dbContext.MyEntity.AddOrUpdateSchema(f.ForeignId, "Schema", new MyEntity()
{
FieldName = f.FieldName,
});
dbContext.SaveChanges();
return f;
}
}
}
Или, может быть, Entity Framework уже имеет функциональность для этой задачи?
Комментарии:
1. Вы имеете в виду обновление только одного (или нескольких, но не всех) свойства (properties)? Если да, то вот что я использую: общедоступная виртуальная пустота UpdateProperty (идентификатор int, выражение<Функция<Значение, объект>> Свойство NavigationProperty, значение свойства объекта) { var entityToUpdate = this.DbSet.Find (идентификатор); запись var = this.context. Запись (entityToUpdate); запись. Свойство (NavigationProperty). currentValue = PropertyValue; entry.State = EntityState. Изменено; this.context.SaveChanges(); }
2. Да, в большинстве случаев мне нужно обновить одно поле таблицы или предопределенное подмножество свойств.
Ответ №1:
Установите State
свойство в EntityState.Modified
db.Entry(entity).State = EntityState.Modified;
Ответ №2:
Пожалуйста, проверьте, работает ли приведенный ниже код для вас:
using (var dbContext = new MyModel())
{
if (dbContext.MyEntities.Any(e => e.ForeignId == f.ForeignId))
{
dbContext.MyEntities.Attach(f);
dbContext.ObjectStateManager.ChangeObjectState(f, EntityState.Modified);
}
else
{
dbContext.MyEntities.AddObject(f);
}
dbContext.SaveChanges();
}