当前位置: 首页 > news >正文

EF只更新变化的字段

摘要

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

解决办法

代码片段

     public async Task<int> UpdateAsync(T entity, List<string> fieldNames)
        {
            using (var context = new RetailContext())
            {

                if (fieldNames != null && fieldNames.Count > 0)
                {
                    context.Set<T>().Attach(entity);
                    foreach (var item in fieldNames)
                    {
                        context.Entry<T>(entity).Property(item).IsModified = true;
                    }
                }
                else
                {
                    context.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified;
                }

                return await context.SaveChangesAsync();
            }
        }

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

        public async Task<int> UpdateAsync(T entity, Dictionary<string, object> dic)
        {
            try
            {
              
                if (dic != null)
                {
                    SetValue<T>(dic, entity);
                    return await _baseData.UpdateAsync(entity, dic.Keys.ToList());
                }
                else
                {
                    return await _baseData.UpdateAsync(entity, null);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    /// <summary>
        /// 通过反射设置值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dic"></param>
        /// <param name="entity"></param>
        public static void SetValue<T>(Dictionary<string, object> dic, T entity) where T : class ,new()
        {
            Type t = entity.GetType();
            PropertyInfo[] properties = t.GetProperties();
            foreach (var item in properties)
            {
                foreach (var key in dic.Keys)
                {
                    if (key.ToLower() == item.Name.ToLower())
                    {
                        switch (item.PropertyType.ToString())
                        {
                            case "System.Int32":
                                item.SetValue(entity, Convert.ToInt32(dic[key]), null);
                                break;
                            case "System.Boolean":
                                item.SetValue(entity, Convert.ToBoolean(dic[key]), null);
                                break;
                            case "System.String":
                                item.SetValue(entity, Convert.ToString(dic[key]), null);
                                break;
                            case "System.Decimal":
                                item.SetValue(entity, Convert.ToDecimal(dic[key]), null);
                                break;
                            case "System.DateTime":
                                item.SetValue(entity, Convert.ToDateTime(dic[key]), null);
                                break;
                            case "System.Guid":
                                Guid g = dic[key] == null ? new Guid() : new Guid(dic[key].ToString());
                                item.SetValue(entity, g, null);                                
                                break;
                            default:
                                item.SetValue(entity, dic[key], null);
                                break;
                        }

                    }
                }
            }
        }

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

相关文章:

  • OC内存管理
  • MySQL入门(二)
  • 助力合作伙伴引领“互联网+”变革 浪潮预发布高端存储
  • 七:zooKeeper开源客户端ZkClient的api测试
  • 定时任务crontab在书写时的四大坑
  • YUM仓库的部署
  • Laravel 中的一个后期静态绑定
  • 简单使用JSTL攻略
  • Powershell 编写和运行脚本
  • windos 下端口被占用
  • git与eclipse相关
  • 一个在ActionBar上显示图标和菜单PopupMenu的小示例(19)
  • 管理大数据:监测系统创造新的收益
  • 使用Jmeter创建ActiveMQ JMS POINT TO POINT请求
  • select 遇到的坑
  • JS 中的深拷贝与浅拷贝
  • 10个最佳ES6特性 ES7与ES8的特性
  • Android Studio:GIT提交项目到远程仓库
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java 多线程编程之:notify 和 wait 用法
  • Koa2 之文件上传下载
  • Laravel核心解读--Facades
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • SpingCloudBus整合RabbitMQ
  • Spring Boot MyBatis配置多种数据库
  • vue-router 实现分析
  • yii2权限控制rbac之rule详细讲解
  • 创建一个Struts2项目maven 方式
  • 浮现式设计
  • 基于 Babel 的 npm 包最小化设置
  • 基于Android乐音识别(2)
  • 目录与文件属性:编写ls
  • 什么软件可以剪辑音乐?
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 物联网链路协议
  • 线上 python http server profile 实践
  • Hibernate主键生成策略及选择
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • # 达梦数据库知识点
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (MATLAB)第五章-矩阵运算
  • (SpringBoot)第二章:Spring创建和使用
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (四)linux文件内容查看
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转) 深度模型优化性能 调参
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)详解PHP处理密码的几种方式