Частичная модель обновления EntityFramework
Я работаю над проектом mvc, с шаблоном репозитория и структурой сущности, теперь в моей форме у меня есть образец модели
SampleModel
1) название
2) возраст
3) адрес
4) примечания
5) обновленная дата
Я показываю только следующие данные в форме редактирования
1) название
2) возраст
3) адрес
теперь, если я обновляю модель с отсутствующими значениями свойств, используя репозиторий, поля notes, dateupdated имеют значение null.
Мой вопрос заключается в том, как обновлять только несколько выбранных свойств с помощью репозитория (tryupdatemodel недоступен в репозитории), и я не хочу вызывать исходный объект и сопоставлять свойства с обновленной моделью.
Есть ли какой-нибудь способ, он должен быть.
Ответы
Ответ 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);