EF多种更新方法。EF修改,Entity Framework修改。abp vnext ef 更新封装 电脑版发表于:2020/5/16 12:54 [TOC] <br> ####方法1:直接执行更新的sql语句 过于简单不说了 ####方法2:先查询在更新 ``` Users result = oapEntities.Users.Where(a => a.Id == users.Id).FirstOrDefault(); result.UserName = users.UserName; result.Number = users.Number; result.UClass = users.UClass; result.CheckType = users.CheckType; ``` 需要查询一次效率不是太友好 ####方法3:不用查询直接更新 ``` //标识整个对象的状态为修改(他会把里边所有的字段都标识为修改,这个适合修改一个表的所有字段) oapEntities.Entry(users).State = System.Data.Entity.EntityState.Modified; ``` ####方法4:不用查询(不用查询一次效率会提高一些),而且也可以指明需要修改的字段 ``` //先要把实体添加到上下文当中(实体需要在上下文中才能做操作,否则会报错:实体不在上下文中) oapEntities.Users.Attach(users); var entry = oapEntities.Entry(users); entry.Property("UserName").IsModified = true;//指明用户名这个字段是因为被修改的 entry.Property("Number").IsModified = true; entry.Property("UClass").IsModified = true; entry.Property("CheckType").IsModified = true; ``` ####方法5:封装通用的不查询更新需要字段的方法 ``` public int Update(T t, string keyName) { var entry = context.Entry<T>(t); //把user对象加入上下文,并且是没有改变的状态 entry.State = Microsoft.EntityFrameworkCore.EntityState.Unchanged; //使用反射找到不为空的字段 foreach (var item in t.GetType().GetProperties()) { //虚拟属性是导航属性 if (item.GetMethod.IsVirtual) { continue; } //拿到属性值 object obj = item.GetValue(t); if (obj != null) { //不是主键才去修改,如果是主键就不需要修改了 if (item.Name != keyName) { //表示该字段需要更新 entry.Property(item.Name).IsModified = true; } } } return context.SaveChanges(); } ``` ef core检查某个字段是否是主键: https://www.tnblog.net/aojiancc2/article/details/3278 #### abp vnext ef 更新封装 更新指定的字段: ``` /// <summary> /// 更新指定的字段 /// </summary> /// <param name="entity"></param> /// <param name="fields"></param> /// <returns></returns> public async Task<int> UpdateAsync(TEntity entity, List<string> fields) { if (entity == null || fields == null || fields.Count == 0) return 0; var db = await GetDbContextAsync(); db.Set<TEntity>().Attach(entity); foreach (var item in fields) { db.Entry(entity).Property(item).IsModified = true; } return await db.SaveChangesAsync(); } ``` **更新实体,所有字段会被标记为修改** 使用该方法建议先查询出来在给需要修改的字段赋值。当然修改之前通常会先查询一次,比如验证数据是否存在,数据所有权等,不能把别人的数据更新了撒。 ``` /// <summary> /// 更新实体 /// 所有字段会被标记为修改,使用该方法建议先查询出来在修改需要的字段。当然修改之前通常会先查询一次,需要验证数据是否存在,数据所有权等。 /// </summary> /// <param name="entity"></param> /// <returns></returns> public async Task<int> UpdateAsync(TEntity entity) { if (entity == null) throw new NullReferenceException("更新对象不能为空"); var getDbContext = await GetDbContextAsync(); getDbContext.Entry(entity).State = Microsoft.EntityFrameworkCore.EntityState.Modified; return await getDbContext.SaveChangesAsync(); } ```