EF只更新变化的字段

简介: 原文:EF只更新变化的字段摘要 在使用EF的时候,由于表字段较多,所以在更新的时候,想要只更新变化的字段,有没有办法呢? 解决办法 代码片段 public async Task UpdateAsync(T entity, List fieldNames) {...
原文: 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;
                        }

                    }
                }
            }
        }

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

目录
相关文章
|
11月前
|
人工智能
ES中更新字段和删除字段的操作
ES中更新字段和删除字段的操作
|
11月前
|
数据库
EF ObjectStateManager无法跟踪具有相同键的多个对象
EF ObjectStateManager无法跟踪具有相同键的多个对象
38 0
EF ObjectStateManager无法跟踪具有相同键的多个对象
|
安全 JavaScript Java
行数据上加一个version版本字段,可以有效防止数据重复更新
行数据上加一个version版本字段,可以有效防止数据重复更新
213 0
行数据上加一个version版本字段,可以有效防止数据重复更新
EF部分字段更新,自动忽略null字段
原文:EF部分字段更新,自动忽略null字段  某个项目里的update代码是类似这样的 public T Update(T entity) where T : ModelBase { var set = this.
1558 0
|
数据库 缓存 SQL
EF 更新部分字段写法
原文:EF 更新部分字段写法 EF 更新部分字段写法 1、EF默认是查询出来,修改后保存; 2、设置不修改字段的IsModified为false,此方法不需要先从数据库查询出实体来(最优方法):        db.
3150 0
|
Java 数据库 缓存
JPA更新后查询结果还是更新前的
此时数据库数据状态如下 执行如下流程代码 执行update语句,更新状态字段 语句执行完毕,然而看看数据库 hibernate执行更新需要较长时间,因此需要等待,否则无法获得更新后字段 JPA更新一条记录,数据库查看更新成功,但是紧接着查询,发现还是更新前的结果,怀疑缓存问题但是网上查了下没解决成功。
2029 0
|
关系型数据库 MySQL Oracle
增加、删除、更新触发器
第一步:新建触发器表 SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `dataex_trigger_record`; CREATE TABLE `dataex_trig...
1741 0
|
大数据 测试技术
【测试记录】EF插入查询性能
介绍     背景什么就不提了,无外乎出现了大数据需要处理。简单的说就是我测试了EF正常的插入以及一个优化小方式而已,然后做了查询记录。其余没有什么,写这篇只是为了记录结果方便以后数据参考吧。 代码介绍: 首先是插入代码常规: EFHelp eFHelp = new EFHelp();...
1006 0