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,如需转载请自行联系原作者

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值