我正在使用存储库模式和entity framework的mvc项目,现在在我的窗体上我有一个示例模型
的SampleModel
1)名称
2)年龄
3)地址
4)笔记
5)更新date
我只在编辑表单上显示以下数据
1)名称
2)年龄
3)地址
现在如果我使用存储库更新缺less属性值的模型,注释,dateupdated字段将为空。
我的问题是,我如何更新使用存储库只有less数选定的属性(tryupdatemodel不可用在存储库中),我不想调用原始对象,并映射与更新的模型的合适的。
有什么办法,一定有。
您只能更新字段的子集:
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(); }
这是一个古老的线索,但如果有人有兴趣,扩展拉迪斯拉夫的解决方案,我们已经提出了一个有用的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);