聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~ 如果你感覺文章有幫助,點 ...
聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com
希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~
如果你感覺文章有幫助,點一下推薦,讓更多的朋友參與進來,也是對本人勞動成果的鼓勵,謝謝大家!由於還要工作,所以基本都是犧牲午休時間來寫博客的,寫博客呢不是簡單的Ctrl+C、Ctrl+V,我是要挨著做一遍的,這也是對大家負責,所以有些時候更新不及時,或者問題沒有及時解答,希望大家諒解,再次感謝大家!!
因為我引用了許多以前積累的類庫,所以有些東西是重覆的(後來更新),有些東西是過時的,包括我寫的代碼,希望大家不要純粹的複製,取其精華去其糟粕>_<。
索引
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目 目錄索引
簡述
前言:
從今天開始,我們逐步把修正前後的源碼分享給大家,還是百度網盤分享,百度網盤只發兩次,兩次都失效後,請大家互相傳遞。
發送方式還是按樓層:推薦 + 周一、周三、周五、周日:單號樓層;周二、周四、周六:雙號樓層。
資料庫,已經在上一章發佈完成的項目中給大家了,這裡不再重覆發送資料庫。
今天,分享的是修改前後的倉儲IRepository、RepositoryBase
修改前弊端:
如果大家仔細看過之前的倉儲IRepository、RepositoryBase,那麼大家肯定會發現,這個類無論是在效率上還是邏輯上,還是有很多不合適、不合理的。我本來是想在 【無私分享:ASP.NET CORE 項目實戰】目錄索引 系列中逐步修改,但是經過再三考慮,如果把這個源碼直接給大家,對於剛接觸的朋友實在是太不負責任,容易產生誤導,所以,還是要在這裡進行修正。
在【無私分享:ASP.NET CORE 項目實戰(第五章)】Repository倉儲 UnitofWork 這篇文章中,簡單介紹了一下個人對於UnitOfWrok的理解,雖然 EF 是自帶事務的,但是我們的 Context.SaveChanges() 無疑拋棄了統一的事務,同時,作為一個封裝的倉儲類,我們是應該提供 串列和並行 兩種方式的,至於到底用不用非同步方式,這個我們不能泛濫,非同步不是沒有損耗的,我們只是提供兩種方式,到底用什麼,要根據業務需要調用,而不是一味的非同步方式,所有的東西都是過無不及。
修正一:添加UnitOfWork
這是我們之前的Service 類庫:
我們添加 IUnitOfWork 介面 和 UnitOfWork 實現類
1 namespace Service 2 { 3 public interface IUnitOfWork 4 { 5 /// <summary> 6 /// 提交 7 /// </summary> 8 /// <returns></returns> 9 bool Commit(); 10 16 } 17 }
1 public class UnitOfWork : IUnitOfWork, IDisposable 2 { 3 #region 數據上下文 4 5 private DbContext context = new MyConfig().db; 6 /// <summary> 7 /// 數據上下文 8 /// </summary> 9 public DbContext _Context 10 { 11 get 12 { 13 context.Configuration.ValidateOnSaveEnabled = false; 14 return context; 15 } 16 } 17 18 #endregion 19 20 /// <summary> 21 /// 提交 22 /// </summary> 23 /// <returns></returns> 24 public bool Commit() 25 { 26 return _Context.SaveChanges() > 0; 27 } 28 29 public void Dispose() 30 { 31 if (_Context != null) 32 { 33 _Context.Dispose(); 34 } 35 GC.SuppressFinalize(this); 36 } 37 }
修正二:修改IRepository
首先,把涉及到事務的沒用都刪掉:
修改單模型CRUD操作:①、增加非同步方式 ②、添加 bool IsCommit = true 參數,判斷是否提交
這個參數的主要作用是,我們在進行單項操作的時候,可以直接提交保存,當進行多項操作的時候,我們這個傳入False,然後 通過 UnitOfWork 統一提交保存
1 #region 單模型 CRUD 操作 2 /// <summary> 3 /// 增加一條記錄 4 /// </summary> 5 /// <param name="entity">實體模型</param> 6 /// <param name="IsCommit">是否提交(預設提交)</param> 7 /// <returns></returns> 8 bool Save(T entity, bool IsCommit = true); 9 /// <summary> 10 /// 增加一條記錄(非同步方式) 11 /// </summary> 12 /// <param name="entity">實體模型</param> 13 /// <param name="IsCommit">是否提交(預設提交)</param> 14 /// <returns></returns> 15 Task<bool> SaveAsync(T entity, bool IsCommit = true); 16 17 /// <summary> 18 /// 更新一條記錄 19 /// </summary> 20 /// <param name="entity">實體模型</param> 21 /// <param name="IsCommit">是否提交(預設提交)</param> 22 /// <returns></returns> 23 bool Update(T entity, bool IsCommit = true); 24 /// <summary> 25 /// 更新一條記錄(非同步方式) 26 /// </summary> 27 /// <param name="entity">實體模型</param> 28 /// <param name="IsCommit">是否提交(預設提交)</param> 29 /// <returns></returns> 30 Task<bool> UpdateAsync(T entity, bool IsCommit = true); 31 32 /// <summary> 33 /// 增加或更新一條記錄 34 /// </summary> 35 /// <param name="entity">實體模型</param> 36 /// <param name="IsSave">是否增加</param> 37 /// <param name="IsCommit">是否提交(預設提交)</param> 38 /// <returns></returns> 39 bool SaveOrUpdate(T entity, bool IsSave, bool IsCommit = true); 40 /// <summary> 41 /// 增加或更新一條記錄(非同步方式) 42 /// </summary> 43 /// <param name="entity">實體模型</param> 44 /// <param name="IsSave">是否增加</param> 45 /// <param name="IsCommit">是否提交(預設提交)</param> 46 /// <returns></returns> 47 Task<bool> SaveOrUpdateAsync(T entity, bool IsSave, bool IsCommit = true); 48 49 #endregion
修改多模型操作,同時增加非同步方式:
1 #region 多模型操作 2 /// <summary> 3 /// 增加多條記錄,同一模型 4 /// </summary> 5 /// <param name="T1">實體模型集合</param> 6 /// <param name="IsCommit">是否提交(預設提交)</param> 7 /// <returns></returns> 8 bool SaveList(List<T> T1, bool IsCommit = true); 9 /// <summary> 10 /// 增加多條記錄,同一模型(非同步方式) 11 /// </summary> 12 /// <param name="T1">實體模型集合</param> 13 /// <param name="IsCommit">是否提交(預設提交)</param> 14 /// <returns></returns> 15 Task<bool> SaveListAsync(List<T> T1, bool IsCommit = true); 16 17 /// <summary> 18 /// 增加多條記錄,獨立模型 19 /// </summary> 20 /// <param name="T1">實體模型集合</param> 21 /// <param name="IsCommit">是否提交(預設提交)</param> 22 /// <returns></returns> 23 bool SaveList<T1>(List<T1> T, bool IsCommit = true) where T1 : class; 24 /// <summary> 25 /// 增加多條記錄,獨立模型(非同步方式) 26 /// </summary> 27 /// <param name="T1">實體模型集合</param> 28 /// <param name="IsCommit">是否提交(預設提交)</param> 29 /// <returns></returns> 30 Task<bool> SaveListAsync<T1>(List<T1> T, bool IsCommit = true) where T1 : class; 31 32 /// <summary> 33 /// 更新多條記錄,同一模型 34 /// </summary> 35 /// <param name="T1">實體模型集合</param> 36 /// <param name="IsCommit">是否提交(預設提交)</param> 37 /// <returns></returns> 38 bool UpdateList(List<T> T1, bool IsCommit = true); 39 /// <summary> 40 /// 更新多條記錄,同一模型(非同步方式) 41 /// </summary> 42 /// <param name="T1">實體模型集合</param> 43 /// <param name="IsCommit">是否提交(預設提交)</param> 44 /// <returns></returns> 45 Task<bool> UpdateListAsync(List<T> T1, bool IsCommit = true); 46 47 /// <summary> 48 /// 更新多條記錄,獨立模型 49 /// </summary> 50 /// <param name="T1">實體模型集合</param> 51 /// <param name="IsCommit">是否提交(預設提交)</param> 52 /// <returns></returns> 53 bool UpdateList<T1>(List<T1> T, bool IsCommit = true) where T1 : class; 54 /// <summary> 55 /// 更新多條記錄,獨立模型(非同步方式) 56 /// </summary> 57 /// <param name="T1">實體模型集合</param> 58 /// <param name="IsCommit">是否提交(預設提交)</param> 59 /// <returns></returns> 60 Task<bool> UpdateListAsync<T1>(List<T1> T, bool IsCommit = true) where T1 : class; 61 62 /// <summary> 63 /// 刪除多條記錄,同一模型 64 /// </summary> 65 /// <param name="T1">實體模型集合</param> 66 /// <param name="IsCommit">是否提交(預設提交)</param> 67 /// <returns></returns> 68 bool DeleteList(List<T> T1, bool IsCommit = true); 69 /// <summary> 70 /// 刪除多條記錄,同一模型(非同步方式) 71 /// </summary> 72 /// <param name="T1">實體模型集合</param> 73 /// <param name="IsCommit">是否提交(預設提交)</param> 74 /// <returns></returns> 75 Task<bool> DeleteListAsync(List<T> T1, bool IsCommit = true); 76 77 /// <summary> 78 /// 刪除多條記錄,獨立模型 79 /// </summary> 80 /// <param name="T1">實體模型集合</param> 81 /// <param name="IsCommit">是否提交(預設提交)</param> 82 /// <returns></returns> 83 bool DeleteList<T1>(List<T1> T, bool IsCommit = true) where T1 : class; 84 /// <summary> 85 /// 刪除多條記錄,獨立模型(非同步方式) 86 /// </summary> 87 /// <param name="T1">實體模型集合</param> 88 /// <param name="IsCommit">是否提交(預設提交)</param> 89 /// <returns></returns> 90 Task<bool> DeleteListAsync<T1>(List<T1> T, bool IsCommit = true) where T1 : class; 91 92 /// <summary> 93 /// 通過Lamda表達式,刪除一條或多條記錄 94 /// </summary> 95 /// <param name="predicate"></param> 96 /// <param name="IsCommit"></param> 97 /// <returns></returns> 98 bool Delete(Expression<Func<T, bool>> predicate, bool IsCommit = true); 99 /// <summary> 100 /// 通過Lamda表達式,刪除一條或多條記錄(非同步方式) 101 /// </summary> 102 /// <param name="predicate"></param> 103 /// <param name="IsCommit"></param> 104 /// <returns></returns> 105 Task<bool> DeleteAsync(Expression<Func<T, bool>> predicate, bool IsCommit = true); 106 107 /// <summary> 108 /// 執行SQL刪除 109 /// </summary> 110 /// <param name="sql">SQL語句</param> 111 /// <param name="para">Parameters參數</param> 112 int DeleteBySql(string sql, params DbParameter[] para); 113 /// <summary> 114 /// 執行SQL刪除(非同步方式) 115 /// </summary> 116 /// <param name="sql">SQL語句</param> 117 /// <param name="para">Parameters參數</param> 118 Task<int> DeleteBySql(string sql, params DbParameter[] para); 119 #endregion
修改獲取多條數據操作,同時增加非同步方式:
1 #region 獲取多條數據操作 2 3 /// <summary> 4 /// 返回IQueryable集合,延時載入數據 5 /// </summary> 6 /// <param name="predicate"></param> 7 /// <returns></returns> 8 IQueryable<T> LoadAll(Expression<Func<T, bool>> predicate); 9 /// <summary> 10 /// 返回IQueryable集合,延時載入數據(非同步方式) 11 /// </summary> 12 /// <param name="predicate"></param> 13 /// <returns></returns> 14 Task<IQueryable<T>> LoadAllAsync(Expression<Func<T, bool>> predicate); 15 16 // <summary> 17 /// 返回List<T>集合,不採用延時載入 18 /// </summary> 19 /// <param name="predicate"></param> 20 /// <returns></returns> 21 List<T> LoadListAll(Expression<Func<T, bool>> predicate); 22 // <summary> 23 /// 返回List<T>集合,不採用延時載入(非同步方式) 24 /// </summary> 25 /// <param name="predicate"></param> 26 /// <returns></returns> 27 Task<List<T>> LoadListAllAsync(Expression<Func<T, bool>> predicate); 28 29 /// <summary> 30 /// 獲取DbQuery的列表 31 /// </summary> 32 /// <param name="predicate"></param> 33 /// <returns></returns> 34 DbQuery<T> LoadQueryAll(Expression<Func<T, bool>> predicate); 35 /// <summary> 36 /// 獲取DbQuery的列表(非同步方式) 37 /// </summary> 38 /// <param name="predicate"></param> 39 /// <returns></returns> 40 Task<DbQuery<T>> LoadQueryAllAsync(Expression<Func<T, bool>> predicate); 41 42 /// <summary> 43 /// 獲取IEnumerable列表 44 /// </summary> 45 /// <param name="sql">SQL語句</param> 46 /// <param name="para">Parameters參數</param> 47 /// <returns></returns> 48 IEnumerable<T> LoadEnumerableAll(string sql,params DbParameter[] para); 49 /// <summary> 50 /// 獲取IEnumerable列表(非同步方式) 51 /// </summary> 52 /// <param name="sql">SQL語句</param> 53 /// <param name="para">Parameters參數</param> 54 /// <returns></returns> 55 Task<IEnumerable<T>> LoadEnumerableAllAsync(string sql, params DbParameter[] para); 56 57 /// <summary> 58 /// 獲取數據動態集合 59 /// </summary> 60 /// <param name="sql">SQL語句</param> 61 /// <param name="para">Parameters參數</param> 62 /// <returns></returns> 63 IEnumerable LoadEnumerable(string sql, params DbParameter[] para); 64 /// <summary> 65 /// 獲取數據動態集合(非同步方式) 66 /// </summary> 67 /// <param name="sql">SQL語句</param> 68 /// <param name="para">Parameters參數</param> 69 /// <returns></returns> 70 Task<IEnumerable> LoadEnumerableAsync(string sql, params DbParameter[] para); 71 72 /// <summary> 73 /// 採用SQL進行數據的查詢,返回IList集合 74 /// </summary> 75 /// <param name="sql">SQL語句</param> 76 /// <param name="para">Parameters參數</param> 77 /// <returns></returns> 78 List<T> SelectBySql(string sql, params DbParameter[] para); 79 /// <summary> 80 /// 採用SQL進行數據的查詢,返回IList集合(非同步方式) 81 /// </summary> 82 /// <param name="sql">SQL語句</param> 83 /// <param name="para">Parameters參數</param> 84 /// <returns></returns> 85 Task<List<T>> SelectBySqlAsync(string sql, params DbParameter[] para); 86 87 /// <summary> 88 /// 採用SQL進行數據的查詢,指定泛型,返回IList集合 89 /// </summary> 90 /// <typeparam name="T1"></typeparam> 91 /// <param name="sql"></param> 92 /// <param name="para"></param> 93 /// <returns></returns> 94 List<T1> SelectBySql<T1>(string sql, params DbParameter[] para); 95 /// <summary> 96 /// 採用SQL進行數據的查詢,指定泛型,返回IList集合 97 /// </summary> 98 /// <typeparam name="T1"></typeparam> 99 /// <param name="sql"></param> 100 /// <param name="para"></param> 101 /// <returns></returns> 102 Task<List<T1>> SelectBySqlAsync<T1>(string sql, params DbParameter[] para); 103 104 /// <summary> 105 /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回實體對象集合 106 /// </summary> 107 /// <typeparam name="TEntity">實體對象</typeparam> 108 /// <typeparam name="TOrderBy">排序欄位類型</typeparam> 109 /// <typeparam name="TResult">數據結果,與TEntity一致</typeparam> 110 /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param> 111 /// <param name="orderby">排序欄位</param> 112 /// <param name="selector">返回結果(必須是模型中存在的欄位)</param>