摘要

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

解决办法

代码片段

     public async Task<int> UpdateAsync(T entity, List<string> fieldNames)
{
using (var context = new RetailContext())
{ if (fieldNames != null && fieldNames.Count > )
{
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;
} }
}
}
}

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

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. 【译】AI 让科技公司变得更强大吗

    机器学习可能是当今技术中最重要的基本趋势.由于机器学习的基础是数据 - 大量的数据 - 很常见的是,人们越来越担心已经拥有大量数据的公司会变得更强大.这有一定的道理,但是以相当狭窄的方式,同时ML也看 ...

  2. [leetcode.com]算法题目 - Plus One

    Given a number represented as an array of digits, plus one to the number. class Solution { public: v ...

  3. 201621123018《Java程序设计》第8周学习报告

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 contanis方 ...

  4. 【文文殿下】【洛谷】分治NTT模板

    题解 可以计算每一项对后面几项的贡献,然后考虑后面每一项,发现这是一个卷积,直接暴力NTT就行了,发现它是一个有后效性的,我们选择使用CDQ分治. Tips:不能像通常CDQ分治一样直接 每次递归两边 ...

  5. diamond的设计思路

    diamond主要包含四个包:diamond-client.diamond-sdk.diamond-server和diamond-util client就非常简单的进行http的调用server拿数据 ...

  6. fatal: LF would be replaced by CRLF in index.html

    进入项目目录,在.git文件夹下打开config配置文件,添加上下面两句话: autocrlf = false safecrlf = false 即可

  7. 跟着刚哥学Redis

    NoSQL 简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL".是对不同于传统的关系型数据库的数据库管理系统的统称.它泛指非关系型的数据库.随着 ...

  8. 解决 canvas 绘图在高清屏中的模糊问题

    解决 canvas 绘图在高清屏中的模糊问题 为什么模糊 CSS 像素是一个抽象单位(1 px),浏览器根据某种规则将 css 像素转化为屏幕需要的实际像素值. 在高清屏之前,屏幕上显示一个像素点需要 ...

  9. Asp.net管线事件(页面请求周期)

    在处理该请求时将由 HttpApplication 类执行以下事件. 希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件. . 对请求进行验证,将检查浏览器发送的信息,并确定其 ...

  10. python 结巴分词简介以及操作

    中文分词库:结巴分词 文档地址:https://github.com/fxsjy/jieba 代码对 Python 2/3 均兼容 全自动安装:easy_install jieba 或者 pip in ...