EF更新少量字段需要解决两个问题

1.动态的将需要更新的字段提取出来

2.将提取出来的字段设为更新状态

通常更新的时候,都是根据条件将实体取出来,然后赋值字段,最后更新整个实体,所以在方法上看似是更新少量字段,其实是更新了所有字段,比较浪费性能

获取要更新的字段列表

 /// <summary>
/// 获取要更新的字段
/// </summary>
/// <param name="updateAction"></param>
/// <returns></returns>
private List<string> GetUpdateColumns(Action<TEntity> updateAction)
{
List<string> modifyColumns = new List<string>();
TEntity modifyModel = new TEntity();
updateAction(modifyModel);
PropertyInfo[] proArr = typeof(TEntity).GetProperties();
foreach (PropertyInfo info in proArr)
{
if (info.GetValue(modifyModel) != null)
{
modifyColumns.Add(info.Name);
}
}
return modifyColumns;
}

更新

  /// <summary>
/// 更新对象部分属性
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="predicate"></param>
/// <param name="updateAction"></param>
/// <returns></returns>
public TResult Update(Expression<Func<TEntity, bool>> predicate, Action<TEntity> updateAction)
{
List<string> modifyColumns = GetUpdateColumns(updateAction);
//dbContext.Configuration.AutoDetectChangesEnabled = true;
var _model = dbContext.Set<TEntity>().AsNoTracking().Where(predicate).ToList();
if (_model == null) return new TResult(false, "参数为NULL");
_model.ForEach(p =>
{
updateAction(p);
dbContext.Set<TEntity>().Attach(p);
var stateEntry = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectStateManager.GetObjectStateEntry(p);
modifyColumns.ForEach(m => stateEntry.SetModifiedProperty(m));
//dbContext.Entry<TEntity>(p).State = EntityState.Modified;
});
return Save(EntityState.Modified);
}

EF 如何更新少量字段的更多相关文章

  1. EF扩展 更新指定字段

    using System.Data.Entity.Infrastructure; using System.Threading.Tasks; /// <summary> /// EF扩展 ...

  2. EF 只更新部分字段

    /// 只更新storedAddress数据中的DefaultAddress字段,更新为false /// 将默认地址改为不是默认地址 /// </summary> /// <par ...

  3. EF更新指定字段...

    EF更新指定的字段... 搜来搜去发现没有自己想要的啊... 或许本来就有更好的办法来实现我这个,所以没有人来搞吧... 如果有,请不吝告知..GG.. //要更改UserInfo表中指定的列,比如这 ...

  4. EF 更新部分字段写法

    EF 更新部分字段写法 1.EF默认是查询出来,修改后保存: 2.设置不修改字段的IsModified为false,此方法不需要先从数据库查询出实体来(最优方法): db.Set<T>() ...

  5. EF更新指定字段.或个更新整个实体

    EF更新指定字段.或个更新整个实体 更新整个实体: public bool Update(Company compay) { if (compay != null) { dbContext.Entry ...

  6. 【EF】EntityFramework 更新数据库字段的三种方法

    实体类 public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public Tes ...

  7. 关于EF更新数据库,更新指定字段的设置

    1.关于EF跟新数据库更新指定字段的设置 在EF提交到数据库的时候或许某些字段不想更新.或者自己更新一个模型到数据库去! 1.更新数据不更新一些字段 /// <summary> /// 数 ...

  8. EF指定更新字段

    使用EF做更新时,若没有进行跟踪会默认全字段更新,那怎么做到只更新我们想要更新的字段呢? /// <summary> /// 修改指定属性的单条数据 /// </summary> ...

  9. MongoDB学习笔记~为IMongoRepository接口更新指定字段

    回到目录 对于MongoDB来说,它的更新建议是对指定字段来说的,即不是把对象里的所有字段都进行update,而是按需去更新,这在性能上是最优的,这当然也是非常容易理解的,我们今天要实现的就是这种按需 ...

随机推荐

  1. 兼容iOS 10 资料整理笔记

    原文链接:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化 ...

  2. iOS 保持界面流畅的技巧

    http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

  3. java常见的开发工具

    http://www.csdn.net/article/1970-01-01/2824723 http://zhidao.baidu.com/link?url=D8FdJxeFd-z-LV1OfZuZ ...

  4. 深度学习笔记(六)finetune

    转自Caffe fine-tuning 微调网络 一般来说我们自己需要做的方向,比如在一些特定的领域的识别分类中,我们很难拿到大量的数据.因为像在ImageNet上毕竟是一个千万级的图像数据库,通常我 ...

  5. 使用struts的logic:iterate标签遍历列表时得到显示序号

    <logic:notEmpty name="sList" scope="request"> <logic:iterate id="e ...

  6. Python学习【第三篇】Python变量

    变量 声明变量 #!/usr/bin/env python name = "Bourbon" 上述代码声明了一个变量,变量名为:name,变量的值为:"Bourbon&q ...

  7. 自定义EL表达式的函数

    编写描述的tld文件放到web-inf/目录下,才能在jsp页面上调用 <?xml version="1.0" encoding="UTF-8" ?> ...

  8. JSP 登录与注册的小案例

    源代码连接地址如下:链接:http://pan.baidu.com/s/1nvEuHBj 密码:qsr1 #properties文件 driver=oracle.jdbc.driver.OracleD ...

  9. 创建redis集群

    假设你已经安装好了redis ,如果还没有请安装 将多个实例跑起来 创建一个目录,比如 redis-cluster 把redis-server拷贝到这个目录下 在目录下为每一个实例创建一个文件夹 在每 ...

  10. swift language

    API reference Swift UIKit Swift 菜鸟教程 Great Installed Visual Studio Code, I found I cannot open it fr ...