因為增刪改查是我們常用到的方法,我們不可能每個數據模型都去完成增刪改查,這樣的辦法太笨拙了。我們可以寫個父類(包含增刪改查),然后讓所有的數據模型類繼承該父類。那就要求我們的父類必須使用泛型來實現。

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 = 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 #endregion 112 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 #endregion 124 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 #endregion 140 } 141 }
里面用到了反射,可能有些復雜,EF要告一段落了,下面開始記錄mvc學習歷程了。以后可能還會寫個小項目,使用mvc+EF