首页 > 代码库 > Entity Framework 泛型使用

Entity Framework 泛型使用

因为增删改查是我们常用到的方法,我们不可能每个数据模型都去完成增删改查,这样的办法太笨拙了。我们可以写个父类(包含增删改查),然后让所有的数据模型类继承该父类。那就要求我们的父类必须使用泛型来实现。

  1 using System;  2 using System.Collections.Generic;  3 using System.Data.Entity.Infrastructure;  4 using System.Linq;  5 using System.Linq.Expressions;  6 using System.Reflection;  7 using System.Text;  8 using System.Threading.Tasks;  9  10 namespace ConsoleApplication1 11 { 12     /// <summary> 13     /// 定义泛型,必须规定T为类,不然db.Set<T>会报错 14     /// </summary> 15     /// <typeparam name="T"></typeparam> 16     class DALBase<T> where T:class 17     { 18         //因为我们要操作数据库,所以先实例化一个上下文 19         Model1Container db = new Model1Container(); 20  21         #region 添加方法 22         /// <summary> 23         /// 添加方法 24         /// </summary> 25         /// <param name="Model"></param> 26         public void add(T Model) 27         { 28             db.Set<T>().Add(Model); 29             db.SaveChanges(); 30         }  31         #endregion 32  33         #region 修改单个实体 34         /// <summary> 35         /// 修改单个实体 36         /// </summary> 37         /// <param name="Model"></param> 38         /// <param name="strs"></param> 39         public void update(T Model, params string[] strs) 40         { 41             DbEntityEntry entry = db.Entry<T>(Model); 42             entry.State = System.Data.EntityState.Unchanged; 43             foreach (string tempStr in strs) 44             { 45                 entry.Property(tempStr).IsModified = true; 46             } 47             db.SaveChanges(); 48         }  49         #endregion 50  51         #region 批量修改,根据反射,稍微要复杂一些 52         /// <summary> 53         /// 批量修改,根据反射,稍微要复杂一些 54         /// </summary> 55         /// <param name="Model">将值存入属性中</param> 56         /// <param name="where">批量修改的条件</param> 57         /// <param name="strs">属性</param> 58         public void updateBatch(T Model, Expression<Func<T, bool>> where, params string[] strs) 59         { 60             //先根据条件查出符合要修改的集合 61             List<T> tempList = db.Set<T>().Where(where).ToList(); 62             //获取类型 63             Type t = typeof(T); 64             //利用反射获取T类型public属性集合 65             List<PropertyInfo> tempPro = t.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).ToList(); 66             Dictionary<string, PropertyInfo> propertyDic = new Dictionary<string, PropertyInfo>(); 67             //遍历T的所有属性,将符合修改的存入字典中 68             tempPro.ForEach(p => { if (strs.Contains(p.Name)) { propertyDic.Add(p.Name, p); } }); 69             //遍历要修改的属性 70             foreach (string str in strs) 71             { 72                 if (propertyDic.ContainsKey(str)) 73                 { 74                     PropertyInfo propertyInfo = propertyDic[str]; 75                     //获取要修改属性的值 76                     object value = http://www.mamicode.com/propertyInfo.GetValue(Model, null); 77                     foreach (T tempData in tempList) 78                     { 79                         //设置值 80                         propertyInfo.SetValue(tempData, value, null); 81                     } 82                 } 83             } 84         }  85         #endregion 86  87         #region 根据实体id删除操作 88         /// <summary> 89         /// 根据实体id删除操作 90         /// </summary> 91         /// <param name="Model"></param> 92         public void remove(T Model) 93         { 94             db.Set<T>().Attach(Model); 95             db.Set<T>().Remove(Model); 96             db.SaveChanges(); 97         }  98         #endregion 99 100         #region 根据条件删除操作101         /// <summary>102         /// 根据条件删除操作103         /// </summary>104         /// <param name="remWhere"></param>105         public void removeByWhere(Expression<Func<T, bool>> remWhere)106         {107             List<T> tempList = db.Set<T>().Where(remWhere).ToList();108             tempList.ForEach(t => { db.Set<T>().Attach(t); db.Set<T>().Remove(t); });109             db.SaveChanges();110         } 111         #endregion112 113         #region 一般带条件查询114         /// <summary>115         /// 一般带条件查询116         /// </summary>117         /// <param name="where"></param>118         /// <returns></returns>119         public List<T> getList(System.Linq.Expressions.Expression<Func<T, bool>> where)120         {121             return db.Set<T>().Where(where).ToList();122         } 123         #endregion124 125         #region 带条件排序,页码页容量查询126         /// <summary>127         /// 带条件排序,页码页容量查询128         /// </summary>129         /// <typeparam name="TKey"></typeparam>130         /// <param name="where"></param>131         /// <param name="orderBy"></param>132         /// <param name="pageSize"></param>133         /// <param name="pageIndex"></param>134         /// <returns></returns>135         public List<T> getListOrder<TKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> orderBy, int pageSize, int pageIndex)136         {137             return db.Set<T>().Where(where).OrderBy(orderBy).Skip(pageIndex - 1).Take(pageSize).ToList();138         } 139         #endregion140     }141 }
View Code

里面用到了反射,可能有些复杂,EF要告一段落了,下面开始记录mvc学习历程了。以后可能还会写个小项目,使用mvc+EF