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

相关文章
|
存储 开发框架 .NET
Entity Framework基础01
Entity Framework基础01
182 0
Entity Framework基础01
|
存储 API 数据库
Entity Framework 约定
Entity Framework 约定
123 0
|
SQL C# 数据库
Entity Framework 继承映射
Entity Framework 继承映射
115 0
Entity Framework 继承映射
|
API 数据库
Entity Framework 私有属性映射
Entity Framework 私有属性映射
64 0
|
数据库 C#
Entity Framework 简单属性映射
Entity Framework 简单属性映射
1070 0
Entity Framework 简单属性映射
|
数据库
Entity Framework 一对一关系映射
Entity Framework 一对一关系映射
225 0
Entity Framework 一对一关系映射
|
XML 测试技术 数据格式
一起谈.NET技术,如何将XML与OBJECT进行相互转换(泛型以及通用方法)
  对于ORMCodeHelper(Keny的),完全的采用插件式开发,即插即用,个人感觉还是比较爽的,架构不错。它包括了SQL SERVER 2000,SQL SERVER 2005以及ORACLE的相关C#代码的生成。
795 0
|
数据库
一起谈.NET技术,在Entity Framework 4中映射现有实体类(POCO)
  Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架。   Entity Framework的主要特点:   1. 支持多种数据库(Microsoft SQL Server, Oracle, and DB2);   2. 强劲的映射引擎,能很好地支持存储过程;   3. 提供Visual Studio集成工具,进行可视化操作;   4. 能够与ASP.NET, WPF, WCF, WCF Data Services进行很好的集成。
1033 0