快速傳送
手擼ORM淺談ORM框架之Delete篇
手擼ORM淺談ORM框架之Query篇
後續待定。。。。。。
前人栽樹,後人乘涼
BaseRepository-》GetCurrentTableName、GetExcludeKeyAllFields已經在《手擼ORM淺談ORM框架之Add篇》BaseRepository裡面的方法,不重複搬磚了。
承上啟下,傳遞希望
BaseRepository-》GetKey獲取表主鍵,目前自動遞增主鍵使用的KeyAttribute標識自動遞增主鍵,更新不需要區分主鍵型別獲取當前實體所有的主鍵作為where更新條件;如果專案中需要使用複合主鍵、指定主鍵(按照業務單元生成的業務所需主鍵,例如: SN2020102600001等),獲取Key的方法加入自定義的xxxAttribute作為條件之一,來滿足當前的業務需要;
1 /// <summary> 2 /// get key-atttribute 3 /// </summary> 4 /// <returns>return key-attribute</returns> 5 private List<PropertyInfo> GetKey() 6 { 7 List<PropertyInfo> list = new List<PropertyInfo>(); 8 PropertyInfo[] properties = typeof(T).GetProperties(); 9 foreach (var item in properties) 10 { 11 if (item.CustomAttributes.Any(c => c.AttributeType.Name == nameof(KeyAttribute))) 12 { 13 list.Add(item); 14 } 15 } 16 return list; 17 }
BaseRepository-》GetUpdateSql來來來Sql出現了(提高效能可以優化,快取當前專案所有表的增刪查改Sql語句)
1 /// <summary> 2 /// get update sql 3 /// </summary> 4 /// <param name="entity"></param> 5 /// <returns></returns> 6 private string GetUpdateSql(T entity) 7 { 8 string tableName = GetCurrentTableName(); 9 StringBuilder stringBuilder = new StringBuilder(); 10 List<PropertyInfo> properties = GetExcludeKeyAllFields(); 11 foreach (var item in properties) 12 { 13 stringBuilder.AppendFormat("{0}=@{0},", item.Name); 14 } 15 stringBuilder.Remove(stringBuilder.Length - 1, 1); 16 stringBuilder.Append(" WHERE "); 17 List<PropertyInfo> propertyKeys = GetKey(); 18 foreach (var propertyKey in propertyKeys) 19 { 20 stringBuilder.AppendFormat("{0}=@{0} AND ", propertyKey.Name); 21 } 22 stringBuilder.Remove(stringBuilder.Length - 4, 4); 23 return string.Format("UPDATE {0} SET {1}", tableName, stringBuilder); 24 }
BaseRepository-》泛型Update;
1 /// <summary> 2 /// udpate entity 3 /// </summary> 4 /// <param name="entity">entity</param> 5 /// <returns>return true or false</returns> 6 public bool Update(T entity) 7 { 8 string sql = GetUpdateSql(entity); 9 MySqlParameter[] parameters = GetMySqlParameters(entity.GetType().GetProperties(), entity); 10 int row = context.Database.ExecuteSqlRaw(sql, parameters); 11 return row > 0 ? true : false; 12 }
實操Repository方法泛型約束;
1 public bool Update(Learn_Student learnStudent) 2 { 3 using (MySqlDbContext mySqlDbContext = new MySqlDbContext()) 4 { 5 BaseRepository<Learn_Student> baseRepository = new BaseRepository<Learn_Student>(mySqlDbContext); 6 return baseRepository.Update(learnStudent); 7 } 8 }
注:learn-orm-net目前只是作為學習ORM框架原理的Demo,專案會做出一定的優化處理,但不能直接拿來在專案中使用,畢竟現在NET Framework、NET Core已經有很多優秀的ORM框架,NET下一次釋出就是隻有一個版本了,我們沒有必要重複造輪子,造輪子是因為沒有現成的優秀的輪子可用。
程式碼下載地址: SourceCode 作者水平有限歡迎園友糾正錯誤及不恰當之處,予以及時修正以免誤導他人!