ASP.NET MVC5網(wǎng)站開發(fā)之實現(xiàn)數(shù)據(jù)存儲層功能(三)
數(shù)據(jù)存儲層在項目Ninesky.DataLibrary中實現(xiàn),整個項目只有一個類Repository。
Repository中實現(xiàn)增刪改查詢等方法供業(yè)務(wù)邏輯層調(diào)用,主要功能如下圖:
具體步驟
一、添加實體框架的引用
1、打開解決方案,選擇項目Ninesky.DataLibrary,在引用上右鍵,選擇管理NuGet程序包。
在NuGet包管理器中的瀏覽標(biāo)簽中點擊EntityFramework,點擊右側(cè)欄的安裝按鈕。
在搜索框輸入EntityFramework.zh-Hans,安裝假體中文資源包。
二、實現(xiàn)數(shù)據(jù)倉儲類
打開解決方案,選擇項目Ninesky.DataLibrary,將Class1.cs重命名為Repository.cs,在文檔頭添加using System.Data.Entity;將類名重命名為public class Repository。改為public class Repository<T> where T :class
1、DbContext屬性
在Repository類中添加如下代碼 public DbContext DbContext { get; set; }
2、構(gòu)造函數(shù)
為類中添加夠高函數(shù),可以直接傳遞DbContex。
public Repository() { } public Repository(DbContext dbContext) { DbContext = dbContext; }
3、查找實體方法Find
Find有一個重載。兩個方法分別可以根據(jù)ID和根據(jù)lamdba表達式查找實體。
/// <summary> /// 查找實體 /// </summary> /// <param name="ID">實體主鍵值</param> /// <returns></returns> public T Find(int ID) { return DbContext.Set<T>().Find(ID); } /// <summary> /// 查找實體 /// </summary> /// <param name="where">查詢Lambda表達式</param> /// <returns></returns> public T Find(Expression<Func<T,bool>> where) { return DbContext.Set<T>().SingleOrDefault(where); }
4、查找實體列表方法FindList
根據(jù)需要FindList進行多次重載
/// <summary> /// 查找實體列表 /// </summary> /// <returns></returns> public IQueryable<T> FindList() { return DbContext.Set<T>(); } /// <summary> /// 查找實體列表 /// </summary> /// <typeparam name="TKey">排序建類型</typeparam> /// <param name="order">排序表達式</param> /// <param name="asc">是否正序</param> /// <returns></returns> public IQueryable<T> FindList<TKey>(Expression<Func<T, TKey>> order, bool asc) { return asc ? DbContext.Set<T>().OrderBy(order) : DbContext.Set<T>().OrderByDescending(order); } /// <summary> /// 查找實體列表 /// </summary> /// <typeparam name="TKey">排序鍵類型</typeparam> /// <param name="order">排序鍵</param> /// <param name="asc">是否正序</param> /// <param name="number">獲取的記錄數(shù)量</param> /// <returns></returns> public IQueryable<T> FindList<TKey>(Expression<Func<T, TKey>> order, bool asc,int number) { return asc ? DbContext.Set<T>().OrderBy(order).Take(number) : DbContext.Set<T>().OrderByDescending(order).Take(number); } /// <summary> /// 查找實體列表 /// </summary> /// <param name="where">查詢Lambda表達式</param> /// <returns></returns> public IQueryable<T> FindList(Expression<Func<T, bool>> where) { return DbContext.Set<T>().Where(where); } /// <summary> /// 查找實體列表 /// </summary> /// <param name="where">查詢Lambda表達式</param> /// <param name="number">獲取的記錄數(shù)量</param> /// <returns></returns> public IQueryable<T> FindList(Expression<Func<T, bool>> where, int number) { return DbContext.Set<T>().Where(where).Take(number); } /// <summary> /// 查找實體列表 /// </summary> /// <typeparam name="TKey">排序鍵類型</typeparam> /// <param name="where">查詢Lambda表達式</param> /// <param name="order">排序鍵</param> /// <param name="asc">是否正序</param> /// <returns></returns> public IQueryable<T> FindList<TKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> order, bool asc) { return asc ? DbContext.Set<T>().Where(where).OrderBy(order) : DbContext.Set<T>().Where(where).OrderByDescending(order); } /// <summary> /// 查找實體列表 /// </summary> /// <typeparam name="TKey">排序鍵類型</typeparam> /// <param name="where">查詢Lambda表達式</param> /// <param name="order">排序鍵</param> /// <param name="asc">是否正序</param> /// <param name="number">獲取的記錄數(shù)量</param> /// <returns></returns> public IQueryable<T> FindList<TKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> order, bool asc, int number) { return asc ? DbContext.Set<T>().Where(where).OrderBy(order).Take(number) : DbContext.Set<T>().Where(where).OrderByDescending(order).Take(number); }
5、查找實體分頁列表方法FindPageList
根據(jù)需要FindPageList進行多次重載
/// <summary> /// 查找分頁列表 /// </summary> /// <param name="pageSize">每頁記錄數(shù)。必須大于1</param> /// <param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1</param> /// <param name="totalNumber">總記錄數(shù)</param> /// <returns></returns> public IQueryable<T> FindPageList(int pageSize, int pageIndex, out int totalNumber) { if (pageIndex < 1) pageIndex = 1; if (pageSize < 1) pageSize = 10; IQueryable<T> _list = DbContext.Set<T>(); totalNumber = _list.Count(); return _list.Skip((pageIndex - 1) * pageIndex).Take(pageSize); } /// <summary> /// 查找分頁列表 /// </summary> /// <param name="pageSize">每頁記錄數(shù)。必須大于1</param> /// <param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1</param> /// <param name="totalNumber">總記錄數(shù)</param> /// <param name="order">排序鍵</param> /// <param name="asc">是否正序</param> /// <returns></returns> public IQueryable<T> FindPageList<TKey>(int pageSize, int pageIndex, out int totalNumber, Expression<Func<T, TKey>> order, bool asc) { if (pageIndex < 1) pageIndex = 1; if (pageSize < 1) pageSize = 10; IQueryable<T> _list = DbContext.Set<T>(); _list = asc ? _list.OrderBy(order) : _list.OrderByDescending(order); totalNumber = _list.Count(); return _list.Skip((pageIndex - 1) * pageIndex).Take(pageSize); } /// <summary> /// 查找分頁列表 /// </summary> /// <param name="pageSize">每頁記錄數(shù)。必須大于1</param> /// <param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1</param> /// <param name="totalNumber">總記錄數(shù)</param> /// <param name="where">查詢表達式</param> public IQueryable<T> FindPageList(int pageSize, int pageIndex, out int totalNumber, Expression<Func<T, bool>> where) { if (pageIndex < 1) pageIndex = 1; if (pageSize < 1) pageSize = 10; IQueryable<T> _list = DbContext.Set<T>().Where(where); totalNumber = _list.Count(); return _list.Skip((pageIndex - 1) * pageIndex).Take(pageSize); } /// <summary> /// 查找分頁列表 /// </summary> /// <param name="pageSize">每頁記錄數(shù)。必須大于1</param> /// <param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1</param> /// <param name="totalNumber">總記錄數(shù)</param> /// <param name="where">查詢表達式</param> /// <param name="order">排序鍵</param> /// <param name="asc">是否正序</param> public IQueryable<T> FindPageList<TKey>(int pageSize, int pageIndex, out int totalNumber, Expression<Func<T, bool>> where, Expression<Func<T, TKey>> order, bool asc) { if (pageIndex < 1) pageIndex = 1; if (pageSize < 1) pageSize = 10; IQueryable<T> _list = DbContext.Set<T>().Where(where); _list = asc ? _list.OrderBy(order) : _list.OrderByDescending(order); totalNumber = _list.Count(); return _list.Skip((pageIndex - 1) * pageIndex).Take(pageSize); }
6、添加實體方法Add
Add 方法有一個重載,重載方法可以選擇是否立即保存
/// <summary> /// 添加實體 /// </summary> /// <param name="entity">實體</param> /// <returns>受影響的對象的數(shù)目</returns> public int Add(T entity) { return Add(entity, true); } /// <summary> /// 添加實體 /// </summary> /// <param name="entity">實體</param> /// <param name="isSave">是否立即保存</param> /// <returns>在“isSave”為True時返回受影響的對象的數(shù)目,為False時直接返回0</returns> public int Add(T entity,bool isSave) { DbContext.Set<T>().Add(entity); return isSave ? DbContext.SaveChanges() : 0; }
7、更新實體方法Update
Updae 方法有一個重載,重載方法可以選擇是否立即保存
#region Update /// <summary> /// 更新實體【立即保存】 /// </summary> /// <param name="entity">實體</param> /// <returns>在“isSave”為True時返回受影響的對象的數(shù)目,為False時直接返回0</returns> public int Update(T entity) { return Update(entity, true); } /// <summary> /// 更新實體 /// </summary> /// <param name="entity">實體</param> /// <param name="isSave">是否立即保存</param> /// <returns>在“isSave”為True時返回受影響的對象的數(shù)目,為False時直接返回0</returns> public int Update(T entity, bool isSave) { DbContext.Set<T>().Attach(entity); DbContext.Entry<T>(entity).State = EntityState.Modified; return isSave ? DbContext.SaveChanges() : 0; }
8、刪除實體方法Delete
Delete 方法有兩個重載,一個是可以選擇否立即保存,另一個是批量刪除
/// <summary> /// 刪除實體【立即保存】 /// </summary> /// <param name="entity">實體</param> /// <returns>受影響的對象的數(shù)目</returns> public int Delete(T entity) { return Delete(entity, true); } /// <summary> /// 刪除實體 /// </summary> /// <param name="entity">實體</param> /// <param name="isSave">是否立即保存</param> /// <returns>在“isSave”為True時返回受影響的對象的數(shù)目,為False時直接返回0</returns> public int Delete(T entity,bool isSave) { DbContext.Set<T>().Remove(entity); return isSave ? DbContext.SaveChanges() : 0; } /// <summary> /// 批量刪除實體 /// </summary> /// <param name="entities">實體集合</param> /// <returns>受影響的對象的數(shù)目</returns> public int Delete(IEnumerable<T> entities) { DbContext.Set<T>().RemoveRange(entities); return DbContext.SaveChanges(); }
9、統(tǒng)計記錄數(shù)方法Count
Count 方法有一個重載,可以根據(jù)表達式進行統(tǒng)計
/// <summary> /// 記錄數(shù) /// </summary> /// <returns></returns> public int Count() { return DbContext.Set<T>().Count(); } /// <summary> /// 記錄數(shù) /// </summary> /// <param name="predicate">表達式</param> /// <returns></returns> public int Count(Expression<Func<T, bool>> predicate) { return DbContext.Set<T>().Count(predicate); }
10、是否存在
/// <summary> /// 記錄是否存在 /// </summary> /// <param name="predicate">表達式</param> /// <returns></returns> public bool IsContains(Expression<Func<T, bool>> predicate) { return Count(predicate) > 0; }
11、保存到數(shù)據(jù)庫
/// <summary> /// 保存數(shù)據(jù)【在Add、Upate、Delete未立即保存的情況下使用】 /// </summary> /// <returns>受影響的記錄數(shù)</returns> public int Save() { return DbContext.SaveChanges(); }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在ASP.NET?Core微服務(wù)架構(gòu)下使用RabbitMQ實現(xiàn)CQRS模式的方法
ASP.NET Core微服務(wù)架構(gòu)中,使用RabbitMQ作為消息隊列服務(wù),通過實現(xiàn)CQRS模式,將寫操作和讀操作分離,以提高系統(tǒng)的性能和可伸縮性,本文小編將為大家介紹如何在ASP.NET Core微服務(wù)架構(gòu)下使用RabbitMQ來實現(xiàn)CQRS模式,感興趣的朋友一起看看吧2024-01-01Asp.Net 文件操作基類(讀取,刪除,批量拷貝,刪除,寫入,獲取文件夾大小,文件屬性,遍歷目錄)
Asp.Net 文件操作基類(讀取,刪除,批量拷貝,刪除,寫入,獲取文件夾大小,文件屬性,遍歷目錄),需要的朋友可以參考下2008-07-07.Net Core WebApi的簡單創(chuàng)建以及使用方法
這篇文章主要給大家介紹了關(guān)于.Net Core WebApi的簡單創(chuàng)建以及使用方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用.Net Core WebApi具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09ASP.NET Core 2.0 支付寶掃碼支付的實現(xiàn)代碼
這篇文章主要介紹了ASP.NET Core 2.0 支付寶掃碼支付的實現(xiàn)代碼,需要的朋友可以參考下2017-10-10.NET Core使用EF生成數(shù)據(jù)庫出錯的解決方法
這篇文章介紹了.NET Core使用EF生成數(shù)據(jù)庫出錯的解決方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01