摘要

在使用EF的时候,由于表字段较多,所以在更新的时候,想要只更新变化的字段,有没有办法呢?

解决办法

代码片段

  1. public async Task<int> UpdateAsync(T entity, List<string> fieldNames)
  2. {
  3. using (var context = new RetailContext())
  4. {
  5.  
  6. if (fieldNames != null && fieldNames.Count > )
  7. {
  8. context.Set<T>().Attach(entity);
  9. foreach (var item in fieldNames)
  10. {
  11. context.Entry<T>(entity).Property(item).IsModified = true;
  12. }
  13. }
  14. else
  15. {
  16. context.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified;
  17. }
  18.  
  19. return await context.SaveChangesAsync();
  20. }
  21. }

将变化的字段名称放在集合中,并修改其是否变化的状态。

  1. public async Task<int> UpdateAsync(T entity, Dictionary<string, object> dic)
  2. {
  3. try
  4. {
  5.  
  6. if (dic != null)
  7. {
  8. SetValue<T>(dic, entity);
  9. return await _baseData.UpdateAsync(entity, dic.Keys.ToList());
  10. }
  11. else
  12. {
  13. return await _baseData.UpdateAsync(entity, null);
  14. }
  15. }
  16. catch (Exception ex)
  17. {
  18. throw ex;
  19. }
  20. }
  1. /// <summary>
  2. /// 通过反射设置值
  3. /// </summary>
  4. /// <typeparam name="T"></typeparam>
  5. /// <param name="dic"></param>
  6. /// <param name="entity"></param>
  7. public static void SetValue<T>(Dictionary<string, object> dic, T entity) where T : class ,new()
  8. {
  9. Type t = entity.GetType();
  10. PropertyInfo[] properties = t.GetProperties();
  11. foreach (var item in properties)
  12. {
  13. foreach (var key in dic.Keys)
  14. {
  15. if (key.ToLower() == item.Name.ToLower())
  16. {
  17. switch (item.PropertyType.ToString())
  18. {
  19. case "System.Int32":
  20. item.SetValue(entity, Convert.ToInt32(dic[key]), null);
  21. break;
  22. case "System.Boolean":
  23. item.SetValue(entity, Convert.ToBoolean(dic[key]), null);
  24. break;
  25. case "System.String":
  26. item.SetValue(entity, Convert.ToString(dic[key]), null);
  27. break;
  28. case "System.Decimal":
  29. item.SetValue(entity, Convert.ToDecimal(dic[key]), null);
  30. break;
  31. case "System.DateTime":
  32. item.SetValue(entity, Convert.ToDateTime(dic[key]), null);
  33. break;
  34. case "System.Guid":
  35. Guid g = dic[key] == null ? new Guid() : new Guid(dic[key].ToString());
  36. item.SetValue(entity, g, null);
  37. break;
  38. default:
  39. item.SetValue(entity, dic[key], null);
  40. break;
  41. }
  42.  
  43. }
  44. }
  45. }
  46. }

通过反射的方式对变化的字段进行赋值。字段中保存变化的字段名称与值。

EF只更新变化的字段的更多相关文章

  1. EF 只更新部分字段

    /// 只更新storedAddress数据中的DefaultAddress字段,更新为false /// 将默认地址改为不是默认地址 /// </summary> /// <par ...

  2. PDF.NET+EasyUI实现只更新修改的字段

    PDF.NET 在我看来是目前最简单易用而且高效的orm框架之一,感谢作者深蓝医生 实现的功能是easyui的行内编辑,用到了爱看书不识字的datagrid仿extjs的行内编辑 都是牛人啊. 201 ...

  3. 如何只更新datetime类型字段中的日期

    UPDATE  [dbo].[Order]       SET     CreateDate = STUFF(CONVERT(VARCHAR(50),CreateDate,126) ,1, 10, ' ...

  4. EF 更新指定的字段

    假如你有个表,有30个字段,你只想更新其中的1到2个字段的话,就可以用得上这篇文章 作用:类似于我们以前的sql代码 update xxx表 set name='ok',pwd='ok' where ...

  5. Rafy 框架 - 实体支持只更新部分变更的字段

    Rafy 快一两年没有大的更新了.并不是这个框架没人维护了.相反,主要是因为自己的项目.以及公司在使用的项目,都已经比较稳定了,也没有新的功能添加.但是最近因为外面使用了 Rafy 的几个公司,找到我 ...

  6. Entity Framework 通过Lambda表达式更新指定的字段

    本来需要EF来更新指定的字段,后来在园子里找到了代码 var StateEntry = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectS ...

  7. EF指定更新字段

    使用EF做更新时,若没有进行跟踪会默认全字段更新,那怎么做到只更新我们想要更新的字段呢? /// <summary> /// 修改指定属性的单条数据 /// </summary> ...

  8. EF 如何更新少量字段

    EF更新少量字段需要解决两个问题 1.动态的将需要更新的字段提取出来 2.将提取出来的字段设为更新状态 通常更新的时候,都是根据条件将实体取出来,然后赋值字段,最后更新整个实体,所以在方法上看似是更新 ...

  9. EF扩展 更新指定字段

    using System.Data.Entity.Infrastructure; using System.Threading.Tasks; /// <summary> /// EF扩展 ...

随机推荐

  1. Week Plan:强介入性的效率导师[转]

    做产品有三重境界,以效率工具这一细分领域为例: 第一重——发现用户需求,如 Fleep,敏锐地发现团队协作中的关键——聊天,围绕这一需求做足文章; 第二重——预见用户需求,如 ProcessOn,在以 ...

  2. Python 学习第二章

    本章内容 数据类型 数据运算 表达式 if ...else 语句 表达式 for 循环 表达式 while 循环 一.数据类型 在内存中存储的数据可以有多种类型. 在 Python 有五个标准的数据类 ...

  3. ScintillaNET的应用

    出于工作需要,需要制作一个嵌入在桌面应用中的C语言编辑器,经过一系列调研,目前ScintillaNET应该是最合适的了,开源.轻便.功能丰富,但是踩得坑也很多,接下面一一说道. 目前Scintilla ...

  4. MVC框架json数据展示程序(第一版)

    模型原型:服务器的配置和运行状态信息. 设计要求:Json格式数据解析后,判断配置信息是否是新数据或者是否更新.如是新数据,则直接添加到数据库:若是数据更新,则更新数据库配置信息并更新运行状态信息:都 ...

  5. unity2D 船只型物体驱动的实现

    船只向前行驶的驱动力 假设在水中没有摩擦阻力,船只有惯性,船只可以转弯,按下前进键时船只会在力的作用下使得自身的物理运动方向变化到自身的前方方向,从而向前行进. 上图中 V:船当前物理速度 V1,V2 ...

  6. JavaScript基础(1)-ECMAScript

    一.JavaScript简介 1.JavaScript历史背景 布兰登 • 艾奇(Brendan Eich,1961年-),1995年在网景公司,发明的JavaScript. 刚开始JavaScrip ...

  7. 网页关闭(解决window.close在火狐下不兼容问题)

    熟悉前端的都知道,火狐默认状态非window.open的页面window.close是无效的 网上有很多人说,在火狐的地址栏输入:about:config然后找到dom.allow_scripts_t ...

  8. C#6.0语言规范(八) 语句

    C#提供了各种语句.大多数这些语句对于使用C和C ++编程的开发人员来说都很熟悉. statement : labeled_statement | declaration_statement | em ...

  9. python学习笔记16-装饰器

    装饰器(函数) 1.函数作用域 2.高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式. 3.闭包  闭包就是能够读取其他函数内部变量的函数. 在本质上,闭包 ...

  10. dubbo管控台安装

    1. jdk安装 #  cp installpkgs/jdk-7u67-linux-x64_tar_gz /usr/local #  tar -zxf jdk-7u67-linux-x64_tar_g ...