利用EF做更新时,若没有举行跟踪会默认全字段更新,那怎么做到只更新我们想要更新的字段呢?
- 1 /// <summary>
- 2 /// 修改指定属性的单条数据
- 3 /// </summary>
- 4 /// <typeparam name="T">实体</typeparam>
- 5 /// <param name="context">上下文</param>
- 6 /// <param name="model">要修改的实体信息</param>
- 7 /// <param name="expression">指定修改的字段</param>
- 8 public static void Modify<T>(this DbContext context, T model, Expression<Func<T, object>> expression)
- 9 where T : class
- 10 {
- 11 context.Update(model);
- 12 //4.1将 对象 添加到 EF中
- 13 var entry = context.Entry<T>(model);
- 14 //4.2先设置 对象的包装 状态为 Unchanged
- 15 entry.State = EntityState.Unchanged;
- 16 //4.3循环 被修改的属性名 数组
- 17 foreach (var proInfo in expression.GetPropertyAccessList())
- 18 {
- 19 if (!string.IsNullOrEmpty(proInfo.Name))
- 20 //4.4将每个 被修改的属性的状态 设置为已修改状态;背面天生update语句时,就只为已修改的属性 更新
- 21 entry.Property(proInfo.Name).IsModified = true;
- 22 }
- 23 }
复制代码
利用:如下,更新表Model中Status和UpdateTime字段
- 1 _dbContext.Modify(Model, p => new
- 2 {
- 3 p.Status,
- 4 p.UpdateTime
- 5 });
- 6 await _dbContext.SaveChangesAsync();
复制代码
有的同学会发现,调用的时候利用了_dbContext.SaveChangesAsync(),为什么不直接集成到方法内里呢?这个就因需求而厘革了,如果你的项目中不涉及到多张表的厘革,不需要做一些事件性的处理,那集成到一个方法内里完全没有题目,也支持这么做。
来源:https://www.cnblogs.com/az4215/archive/2019/09/24/11576193.html |