Entity Framework泛型封装

简介:

Entity Framework本身的增删改查其实 已经很方便了,不过做项目的时候用的多了也就觉得有点累了,每个业务实体基本上都涉及到到了增删改查这四个基本的要素,至于封装每个公司可能都不一样,接口,设计模式都用的眼花缭乱,我闲来没事就搞个简单的封装Helper,Github上也有关于EF的扩展Libray,具体没有用过,公司的有自己的封装,自己也没怎么弄,具体地址:https://github.com/loresoft/EntityFramework.Extended.

首先来看段代码,model和context是从数据中直接生成,你可以选择自己习惯的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//新增
   User addUser =  new  User();
   addUser.PersonID =  3 ;
   addUser.UserName =  "keso" ;
   dbContext.Entry<User>(addUser).State = EntityState.Added;
   dbContext.SaveChanges();
   //修改
   User updateUser =  new  User();
   dbContext.Users.Where(item => item.ID ==  2 ).OrderBy(item => item.ID);
   updateUser.UserName = updateUser.UserName +  "测试" ;
   dbContext.Entry<User>(updateUser).State = EntityState.Modified;
   dbContext.SaveChanges();
   //删除
   User delUser = dbContext.Users.Where(item => item.ID ==  2 ).First();
   dbContext.Entry<User>(delUser).State = EntityState.Deleted;
   dbContext.SaveChanges();

 如果每个业务实体都这么写一遍,估计公司水准有待提高,而且开发的也该跳起来骂人,本人只是简单封装下新建一个EFHelper,实际开发会封装的更多,不过底层处理是不变的

1
2
3
4
class  EFHelpler<T> where T :  class
    {
        //...
    }       

 新增

方法:

1
2
3
4
5
6
7
8
9
10
11
12
/// <summary>
       /// 实体新增
       /// </summary>
       /// <param name="model"></param>
       public  void  add(params T[] paramList)
       {
           foreach (var model in paramList)
           {
               dbContext.Entry<T>(model).State = EntityState.Added;
           }
           dbContext.SaveChanges();
       }

 调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
EFHelpler<User> helper =  new  EFHelpler<User>();
          BaseContext dbContext =  new  BaseContext();
          //新增
          List<User> listUser =  new  List<User>();
          for  ( int  i =  0 ; i <  2 ; i++)
          {
              User user =  new  User();
              user.PersonID = i;
              user.UserName =  "FlyElehant"  + i;
              listUser.Add(user);
          }
          helper.add(listUser.ToArray());
          Console.WriteLine( "新增成功" );

 查询

查询分了两种,一种是简单的查询,一种是分页的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/// <summary>
      /// 实体查询
      /// </summary>
      public  IEnumerable<T> getSearchList(System.Linq.Expressions.Expression<Func<T, bool>> where)
      {
          return  dbContext.Set<T>().Where(where);
      }
      /// <summary>
      /// 实体分页查询
      /// </summary>
      /// <typeparam name="TKey"></typeparam>
      /// <param name="where"></param>
      /// <param name="orderBy"></param>
      /// <param name="pageSize"></param>
      /// <param name="pageIndex"></param>
      /// <returns></returns>
      public  IEnumerable<T> getSearchListByPage<TKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> orderBy,  int  pageSize,  int  pageIndex)
      {
          return  dbContext.Set<T>().Where(where).OrderByDescending(orderBy).Skip((pageIndex -  1 ) * pageSize).Take(pageSize);
      }

 简单调用,第二个方式除了分页之外,主要是查询的时候指定一定OrderBy的类型,也就是TKey:

1
2
3
4
5
6
7
var query = helper.getSearchList(item => item.UserName.Contains( "keso" ));
        var queryMulti = helper.getSearchListByPage< int >(item => item.UserName.Contains( "FlyElehant" ), order => order.PersonID,  2 1 );
        query = queryMulti;
        foreach (User user in query)
        {
            Console.WriteLine(user.UserName);
        }

 修改

修改代码稍微读了几行,主要是用到了一下反射:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/// <summary>
     /// 按照条件修改数据
     /// </summary>
     /// <param name="where"></param>
     /// <param name="dic"></param>
     public  void  update(Expression<Func<T, bool>> where, Dictionary<string, object> dic)
     {
         IEnumerable<T> result = dbContext.Set<T>().Where(where).ToList();
         Type type = typeof(T);
         List<PropertyInfo> propertyList = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).ToList();
         //遍历结果集
         foreach (T entity in result)
         {
             foreach (PropertyInfo propertyInfo in propertyList)
             {
                 string propertyName = propertyInfo.Name;
                 if  (dic.ContainsKey(propertyName))
                 {
                     //设置值
                     propertyInfo.SetValue(entity, dic[propertyName],  null );
                 }
             }
         }
         dbContext.SaveChanges();
     }

 调用:

1
2
3
4
5
Dictionary<string,object> dic= new  Dictionary<string,object>();
          dic.Add( "PersonID" , 2 );
          dic.Add( "UserName" , "keso" );
          helper.update(item => item.UserName.Contains( "keso" ), dic);
          Console.WriteLine( "修改成功" );

删除

方法:

1
2
3
4
5
6
7
8
9
10
11
12
/// <summary>
     /// 实体删除
     /// </summary>
     /// <param name="model"></param>
     public  void  delete(params T[] paramList)
     {
         foreach (var model in paramList)
         {
             dbContext.Entry<T>(model).State = EntityState.Deleted;
         }
         dbContext.SaveChanges();
     }

  调用:

1
2
var query = helper.getSearchList(item => item.UserName.Contains( "keso" ));
        helper.delete(query.ToArray());

 完整的EFHelper:

 个人Demo难免有表达不当或者技术失误的地方,如有不当,请多多指出,感激不尽~

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4188600.html,如需转载请自行联系原作者

相关文章
|
运维 C# UED
C# 一分钟浅谈:异常处理的最佳实践
【9月更文挑战第5天】在软件开发中,异常处理对保证程序稳定性和用户体验至关重要。本文从基础概念入手,详细讲解C#中的异常处理策略,并通过代码示例说明如何有效实现异常管理。文章涵盖`try`、`catch`和`finally`块的使用,探讨常见问题如忽略异常和过度捕获,并提出最佳实践建议,如使用具体异常类型、记录异常信息及优雅地处理异常,助力开发者构建更健壮的应用程序。
588 1
|
机器学习/深度学习 算法 机器人
使用Python实现深度学习模型:智能灾害响应与救援机器人
使用Python实现深度学习模型:智能灾害响应与救援机器人
196 16
Limits: MIN_INFLATE_RATIO: 0.010000, Entry: word/media/image5.png
Limits: MIN_INFLATE_RATIO: 0.010000, Entry: word/media/image5.png
427 0
|
消息中间件 网络协议 Java
springboot+netty+kafka实现设备信息收集(完整demo复制可用)
springboot+netty+kafka实现设备信息收集(完整demo复制可用)
197 0
|
缓存 算法
计算机网络:CSMA/CD协议
计算机网络:CSMA/CD协议
460 0
|
大数据 C#
C# 读取大文件 (可以读取3GB大小的txt文件)
原文:C# 读取大文件 (可以读取3GB大小的txt文件) 在处理大数据时,有可能 会碰到 超过3GB大小的文件,如果通过 记事本 或 NotePad++去打开它,会报错,读不到任何文件。
4448 1
|
存储 弹性计算 大数据
阿里云8核64G云服务器多少钱?2024年阿里云8核64G云服务器配置、价格、性能测评
2024年阿里云8核64G云服务器的价格为9934.16元一年。该价格基于特定的配置和促销活动,并可能因时间、活动政策、地域等因素而有所变动。关于阿里云8核64G云服务器的性能测评,该服务器配备了64GB的内存和8核的CPU,具有极高的计算能力和处理速度,适用于处理超大型数据、运行复杂应用或需要极高并发处理能力的场景。多种带宽选择(从1M到5M)可以满足不同的网络需求,确保数据传输的高效性。同时,40GB ESSD云盘提供了快速且稳定的数据存储解决方案,有助于提升整体性能。
743 0
|
编解码
MATLAB | SCI 绘图配色第六期 | 三维折线图
MATLAB | SCI 绘图配色第六期 | 三维折线图
414 0
|
存储 Kubernetes 监控
91道常见的Kubernetes面试题总结
91道常见的Kubernetes面试题总结
647 2
91道常见的Kubernetes面试题总结
|
运维 关系型数据库 MySQL
MySQL DBA的必备参考,两位数据库资深专家呕心沥血之作
互联网发展至今,开源软件已经深入人心,并且受到广泛的支持和响应,很多公司在使用开源软件的同时也输出了一些好的开源产品。MySQL 作为当今世界.上最受欢迎的开源数据库产品之一,在很多互联网企业里起到了不可或缺的作用。由于MySQL的诸多特性,比如开源免费、灵活、轻量简单且越来越多的企业开始使用MySQL,在业界诞生了一大批相关从业者,他们研究MySQL的原理,探讨MySQL的架构,完善MySQL的运维,丰富MySQL的工具,促进MySQL的发展,我们称这些人为MySQL DBA,而本人也是其中之一,深感荣幸。