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扩展 ...
随机推荐
- Django:全文检索功能可参考博客
https://blog.csdn.net/AC_hell/article/details/52875927 https://www.zmrenwu.com/courses/django-blog-t ...
- [翻译]第三天- 在 Mac 上运行 .NET Core 应用程序
原文: http://michaelcrump.net/part3-aspnetcore/ *** 简介 该系列文章的完整列表如下: 第一天 - 在 Windows 下安装和运行 .NET Core ...
- JAVA虚拟机体系结构JAVA虚拟机的生命周期
一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Jav ...
- flask框架1
说flask框架之前,必须得提一下web框架,他的作用是为了利用互联网交流工作文档,我们为什么要使用框架,因为框架的稳定性和可扩展性强并且可以降低开发难度,提高开发效率.总的来说就是避免做无用功,重复 ...
- python传输文件
传输文件简单版 server端: import socket import struct import json import os share_dir = r'C:\py3Project\路飞\第三 ...
- POJ 2661
#include<iostream> #include<stdio.h> using namespace std; int main() { //freopen("a ...
- 利用Warensoft Stock Service编写高频交易软件--DEMO
利用Warensoft Stock Service编写高频交易软件 无论是哪种交易软件,对于程序员来讲,最麻烦的就是去实现各种算法.本文以SAR算法的实现过程为例,为大家说明如何使用Warensoft ...
- (转载)elasticsearch 查询(match和term)
原文地址:https://www.cnblogs.com/yjf512/p/4897294.html elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版 ...
- Java之装饰模式
1.装饰模式的理解 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2.装饰模式由4种角色组成 (1)抽象构件(Componen ...
- Android开发艺术探索学习笔记(四)
第四章 View的工作原理 4.1初识ViewRoot和DecorView ViewRoot是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成 ...