Как обновить подмножество полей с помощью Entity Framework?

#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();
}