ASP.NET MVC5網(wǎng)站開(kāi)發(fā)之實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)層功能(三)
數(shù)據(jù)存儲(chǔ)層在項(xiàng)目Ninesky.DataLibrary中實(shí)現(xiàn),整個(gè)項(xiàng)目只有一個(gè)類(lèi)Repository。
Repository中實(shí)現(xiàn)增刪改查詢(xún)等方法供業(yè)務(wù)邏輯層調(diào)用,主要功能如下圖:

具體步驟
一、添加實(shí)體框架的引用

1、打開(kāi)解決方案,選擇項(xiàng)目Ninesky.DataLibrary,在引用上右鍵,選擇管理NuGet程序包。

在NuGet包管理器中的瀏覽標(biāo)簽中點(diǎn)擊EntityFramework,點(diǎn)擊右側(cè)欄的安裝按鈕。

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

