Частичная модель обновления EntityFramework - программирование
Подтвердить что ты не робот

Частичная модель обновления EntityFramework

Я работаю над проектом mvc, с шаблоном репозитория и структурой сущности, теперь в моей форме у меня есть образец модели

SampleModel
1) название
2) возраст
3) адрес
4) примечания
5) обновленная дата

Я показываю только следующие данные в форме редактирования
1) название
2) возраст
3) адрес

теперь, если я обновляю модель с отсутствующими значениями свойств, используя репозиторий, поля notes, dateupdated имеют значение null.

Мой вопрос заключается в том, как обновлять только несколько выбранных свойств с помощью репозитория (tryupdatemodel недоступен в репозитории), и я не хочу вызывать исходный объект и сопоставлять свойства с обновленной моделью.

Есть ли какой-нибудь способ, он должен быть.

4b9b3361

Ответ 1

Вы можете обновить только подмножество полей:

using (var context = new YourDbContext())
{
    context.SamepleModels.Attach(sampleModel);

    DbEntityEntry<SameplModel> entry = context.Entry(sampleModel);
    entry.Property(e => e.Name).IsModified = true;
    entry.Property(e => e.Age).IsModified = true;
    entry.Property(e => e.Address).IsModified = true;   

    context.SaveChanges();
}

или в ObjectContext API:

using (var context = new YourObjectContext())
{
    context.SamepleModels.Attach(sampleModel);

    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(sampleModel);
    entry.SetModifiedProperty("Name");
    entry.SetModifiedProperty("Age");
    entry.SetModifiedProperty("Address"); 

    context.SaveChanges();
}

Ответ 2

Это старый поток, но если кому-то интересно, чтобы расширить решения Ladislav, у нас появился полезный метод расширения для EF 4.1 и новее:

public static void SetModified<TEntity>(
        this DbEntityEntry<TEntity> entry,
        IEnumerable<Expression<Func<TEntity, object>>> expressions) where TEntity : class, IEntity
    {
        foreach (var expression in expressions)
            entry.Property(expression).IsModified = true;
    }

Очевидно, вам нужно убрать ограничение IEntity, если вы не используете интерфейс с тем же именем для своих POCOs.

Пример использования:

        var user = new User
        {
            Id = Request.Id,
            UserName = Request.UserName,
            FirstName = Request.FirstName
        };

        var expressions = new List<Expression<Func<User, object>>> 
                 { 
                     x => x.UserName, 
                     x => x.FirstName
                 };

        context.Entry(user).SetModified(expressions);