博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展entityframework.extended使之支持整个实体类更新
阅读量:5323 次
发布时间:2019-06-14

本文共 3308 字,大约阅读时间需要 11 分钟。

  第一次写博客,写得不好,多包涵!

  

  

  用过entityframework.extended都知道,更新的时候如db.Users.Update(p=>p.Id, u => new User {FirstName = "newfirstname"})这样用,第一个是条件,第二个参数是更新值,现在问题是,在web开发的时候,如传过来是一个对象实体User,比如修改用户时,按照这样的写法,这个User有多少个字段,那就得一个一个列出来,要是不多的话,也没多大关系,要是多的话,那就相当麻烦,而且要是User对象以后又新增了字段或者删除的话,那就得改源代码.

  如下面代码,MVC开发

   [HttpPost]

        public ActionResult Edit(User model)
        {
            if (ModelState.IsValid)
            {
                model.ModifyBy = "admin";
                model.ModifyTime = DateTime.Now;
                db.Users.Update(p => p.Id == model.Id, p => new User {MembershipCard=model.MembershipCard,QQ=model.QQ });
                return Redirect("Index");
            }
            return View();
        }

 

  假定现在User对象只有3个字段,Id,MembershipCard和QQ,这样用完全没问题,如果有一天要加个电话号码字段,前台显示页面肯定是要加个电话号码输入的,

后台代码就得改成

   db.Users.Update(p => p.Id == model.Id, p => new User {MembershipCard=model.MembershipCard,QQ=model.QQ,Cellphone=model.Cellphone });

  

  改起来很麻烦,而且字段多的话,一大堆,看起来也不简洁,

  我们可不可以这样呢,

  

  db.Users.Update(p => p.Id == model.Id, p =>model);

  答案是可以的,只不过要扩展entityframework.extended中的EntityFramework.Extended类库中Extensions目录下BatchExtensions.cs文件(public static   int Update<TEntity>(this IQueryable<TEntity> source,Expression<Func<TEntity, bool>> filterExpression,Expression<Func<TEntity, TEntity>> updateExpression)where TEntity : class)方法,

  代码如下

       if (source == null)                throw new ArgumentNullException("source");            if (filterExpression == null)                throw new ArgumentNullException("filterExpression");       #region 这段是新增代码 //唐扬名:扩展Update方法,使以支持db.Carriers.Update(p => p.Id == 1, p => model);            Expression setExpr = updateExpression.Body;            if (setExpr.Type == typeof(TEntity) && !(setExpr is NewExpression))            {                IEnumerable
parameters = updateExpression.Parameters; TEntity t = (TEntity)Expression.Lambda(setExpr).Compile().DynamicInvoke(); var newe = Expression.New(typeof(TEntity)); var property = t.GetType().GetProperties(); List
list = new List
(); foreach (var item in property) {
//自动增长的值不能更新 var idenditi = item.GetCustomAttributes(typeof(DatabaseGeneratedAttribute), false); if (idenditi.Length > 0 && ((DatabaseGeneratedAttribute)(idenditi[0])).DatabaseGeneratedOption == DatabaseGeneratedOption.Identity) { continue; } string name = item.Name; object value = item.GetValue(t, null); ConstantExpression constant = Expression.Constant(value, item.PropertyType); var member = Expression.Bind(typeof(TEntity).GetProperty(name), constant); list.Add(member); }           #endregion Expression body = Expression.MemberInit(newe, list.ToArray()); LambdaExpression expression = Expression.Lambda(body, parameters); updateExpression = (Expression
>)expression; } return source.Where(filterExpression).Update(updateExpression);

 

  当然你还可以继续扩展这个方法,比如更新的时候实体类中的创建人,创建时间不需要更新,可以自定义一个Attribute,在判断如果就这个Attribute的话,就跳过.

 

  写到这里,有不懂的话,QQ联系14467576

 

  

 

  

转载于:https://www.cnblogs.com/berrytang/p/3416084.html

你可能感兴趣的文章
浅谈性能测试
查看>>
Winform 菜单和工具栏控件
查看>>
jequery动态创建form
查看>>
CDH版本大数据集群下搭建的Hue详细启动步骤(图文详解)
查看>>
第六次java作业
查看>>
巧用Win+R
查看>>
浅析原生js模仿addclass和removeclass
查看>>
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
Jenkins执行批处理文件失败
查看>>
深入理解jQuery框架-框架结构
查看>>
[7.14NOIP模拟4]通讯 题解 (Tarjan缩点+贪心)
查看>>
YUI3自动加载树实现
查看>>
python知识思维导图
查看>>
当心JavaScript奇葩的逗号表达式
查看>>
App Store最新审核指南(2015年3月更新版)
查看>>
织梦MIP文章内容页图片适配百度MIP规范
查看>>
点击复制插件clipboard.js
查看>>
[Kali_BT]通过低版本SerialPort蓝牙渗透功能手机
查看>>
C语言学习总结(三) 复杂类型
查看>>