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扩展 ...
随机推荐
- Python 高级编程——单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 在 Py ...
- Windows核心编程:第11章 Windows线程池
Github https://github.com/gongluck/Windows-Core-Program.git //第11章 Windows线程池.cpp: 定义应用程序的入口点. // #i ...
- 【推荐】介绍两款Windows资源管理器,Q-Dir 与 FreeCommander XE(比TotalCommander更易用的免费资源管理器)
你是否也像我一样,随着硬盘.文件数量的增加,而感到对于文件的管理越来越乏力. 于是我试用了传说中的各种软件,包括各种Explorer外壳,或者第三方资源管理器. 最后我确定下来经常使用,并推荐给您的是 ...
- StriveEngine-TCP
文章中的StriveEngine.dll版本为V3.9.0.0,源码下载请到 https://download.csdn.net/download/hanghangz/10966335 先上代码,建立 ...
- 【计算机网络】 DNS学习笔记 (>﹏<)
参考书籍 <计算机网络-自顶向下> 作者 James F. Kurose DNS的作用 DNS是因特网的目录服务 DNS是因特网的目录服务,它提供了主机名到IP地址映射的查询服务 ...
- 项目中jsp的存放
今天早上犯的错, 复习jsp,把jsp放在 WEB-INF 下 我启动项目,想看效果的时候,一直找不到指定的资源404 后来一番探索,我把它拖放在了WebContent 直接访问的,下午看到知识点 ...
- win7 docker 挂载共享目录
在 win7 下用 docker 不像 win10 那样方便,安装包都不一样. 在 win7 下共享一个目录的方法如下: 1. 先设置 win7 到 VirtualBox 中 docker 用的那个虚 ...
- Java代码审计连载之—SQL注入
前言近日闲来无事,快两年都没怎么写代码了,打算写几行代码,做代码审计一年了,每天看代码都好几万行,突然发现自己都不会写代码了,真是很DT.想当初入门代码审计的时候真是非常难,网上几乎找不到什么java ...
- GoLang学习控制语句之字符串
Go语言字符串是一种值类型,且值不可变,即创建某个文本后你无法再次修改这个文本的内容:更深入地讲,字符串是字节的定长数组.Go 代码使用 UTF-8 编码(且不能带 BOM),同时标识符支持 Unic ...
- 【LeetCode】547. 朋友圈
题目 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋友的集 ...