我正在使用mvc项目,使用存储库模式和实体框架,现在在我的表单上我有一个示例模型
的SampleModel
1)姓名
2)年龄
3)地址
4)注意事项
5)更新日期
我只在编辑表格上显示以下数据
1)姓名
2)年龄
3)地址
现在,如果我使用存储库更新缺少属性值的模型,则notes,dateupdated字段将变为空。
我的问题是如何使用存储库更新少数选定的属性(存储库中没有tryupdatemodel),我不想调用原始对象并使用更新的模型映射属性。
有什么办法,必须有。
答案 0 :(得分:21)
您只能更新字段子集:
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();
}
答案 1 :(得分:1)
这是一个老话题,但如果有兴趣的话,为了扩展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约束,除非您为POCO使用相同名称的接口。
示例用法是:
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);