首页 > 代码库 > 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 }
里面用到了反射,可能有些复杂,EF要告一段落了,下面开始记录mvc学习历程了。以后可能还会写个小项目,使用mvc+EF
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。