EF只更新变化的字段
摘要
在使用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只更新变化的字段的更多相关文章
- EF 只更新部分字段
/// 只更新storedAddress数据中的DefaultAddress字段,更新为false /// 将默认地址改为不是默认地址 /// </summary> /// <par ...
- PDF.NET+EasyUI实现只更新修改的字段
PDF.NET 在我看来是目前最简单易用而且高效的orm框架之一,感谢作者深蓝医生 实现的功能是easyui的行内编辑,用到了爱看书不识字的datagrid仿extjs的行内编辑 都是牛人啊. 201 ...
- 如何只更新datetime类型字段中的日期
UPDATE [dbo].[Order] SET CreateDate = STUFF(CONVERT(VARCHAR(50),CreateDate,126) ,1, 10, ' ...
- EF 更新指定的字段
假如你有个表,有30个字段,你只想更新其中的1到2个字段的话,就可以用得上这篇文章 作用:类似于我们以前的sql代码 update xxx表 set name='ok',pwd='ok' where ...
- Rafy 框架 - 实体支持只更新部分变更的字段
Rafy 快一两年没有大的更新了.并不是这个框架没人维护了.相反,主要是因为自己的项目.以及公司在使用的项目,都已经比较稳定了,也没有新的功能添加.但是最近因为外面使用了 Rafy 的几个公司,找到我 ...
- Entity Framework 通过Lambda表达式更新指定的字段
本来需要EF来更新指定的字段,后来在园子里找到了代码 var StateEntry = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectS ...
- EF指定更新字段
使用EF做更新时,若没有进行跟踪会默认全字段更新,那怎么做到只更新我们想要更新的字段呢? /// <summary> /// 修改指定属性的单条数据 /// </summary> ...
- EF 如何更新少量字段
EF更新少量字段需要解决两个问题 1.动态的将需要更新的字段提取出来 2.将提取出来的字段设为更新状态 通常更新的时候,都是根据条件将实体取出来,然后赋值字段,最后更新整个实体,所以在方法上看似是更新 ...
- EF扩展 更新指定字段
using System.Data.Entity.Infrastructure; using System.Threading.Tasks; /// <summary> /// EF扩展 ...
随机推荐
- Azure DevOps Server 2019 (TFS)安装教程
概述 Azure DevOps Server 2019 (之前的名称为TFS),作为微软Azure DevOps 的企业私有(on-premises)服务器,是一个为开发团队提供软件协作开发管理的服务 ...
- SSO集成方案[随笔]
看这个方案之前,先说明下为什么要加入SSO,以防对大家产生不好的影响.我们产品使用传统winform+db服务+Db存储方式开发,一群老菜帮子开发,以传统的datatble做数据传递,很多年了未有变化 ...
- NET 获取实例所表示的日期是星期几
获取日期枚举,可以根据switch去进行操作 DateTime.Now.DayOfWeek
- .net程序和管理员权限的一些事
1.对某个方法设置管理员权限运行(未考证)(假的,必须以管理员权限启动,不然报错) [PrincipalPermission(SecurityAction.Demand, Role = @" ...
- 文件上传下载、socketserver(并发)、解读socketserver源码
1.文件上传/下载 学习了socket套接字,我们现在可以写一个文件上传/下载的程序,如下示例: 分析上边代码,我们发现,client发送上传文件相关信息的字典序列化之后,server又给client ...
- Synchronzied(内置锁)
原文地址:深入JVM锁机制1-synchronized 1. 线程的状态与转换 当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程: Contention List:所有请 ...
- redis集成相关工具类
package cn.yiyuan.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; i ...
- ajaxsubmit 上传文件 在IE中返回的内容 提示下载文件
在ajaxSubmit提交表单的时候,如果表单内有文件上传的话,会判断参数是否配置的iframe为false参数,如果没有,会用创建隐藏iframe方式提交表单,如果设定了iframe为false,则 ...
- zookeeper 备忘
cd /bin $ ./zkCli.sh ls /a 查看 ls /a true 查看并watch create –e /a 临时节点 create –s /a 顺序节点 create –e –s / ...
- 轮播图采用js、jquery实现无缝滚动和非无缝滚动的四种案例实现,兼容ie低版本浏览器
项目源代码下载地址:轮播图 以下为项目实现效果:(由于gif太大,所以只上传一张图片,但效果完全能实现,经测试,在ie各版本浏览器及chrome,firefox等浏览器中均能实现效果,可以实现点击切换 ...