數據存儲層在項目Ninesky.DataLibrary中實現,整個項目只有一個類Repository。
Repository中實現增刪改查詢等方法供業務邏輯層調用,主要功能如下圖:

具體步驟
一、添加實體框架的引用

1、打開解決方案,選擇項目Ninesky.DataLibrary,在引用上右鍵,選擇管理NuGet程序包。

在NuGet包管理器中的瀏覽標簽中點擊EntityFramework,點擊右側欄的安裝按鈕。

在搜索框輸入EntityFramework.zh-Hans,安裝假體中文資源包。
二、實現數據倉儲類
打開解決方案,選擇項目Ninesky.DataLibrary,將Class1.cs重命名為Repository.cs,在文檔頭添加using System.Data.Entity;將類名重命名為public class Repository。改為public class RepositoryT> where T :class
1、DbContext屬性
在Repository類中添加如下代碼 public DbContext DbContext { get; set; }
2、構造函數
為類中添加夠高函數,可以直接傳遞DbContex。
public Repository()
{ }
public Repository(DbContext dbContext)
{
DbContext = dbContext;
}
3、查找實體方法Find
Find有一個重載。兩個方法分別可以根據ID和根據lamdba表達式查找實體。
/// summary>
/// 查找實體
/// /summary>
/// param name="ID">實體主鍵值/param>
/// returns>/returns>
public T Find(int ID)
{
return DbContext.SetT>().Find(ID);
}
/// summary>
/// 查找實體
/// /summary>
/// param name="where">查詢Lambda表達式/param>
/// returns>/returns>
public T Find(ExpressionFuncT,bool>> where)
{
return DbContext.SetT>().SingleOrDefault(where);
}
4、查找實體列表方法FindList
根據需要FindList進行多次重載
/// summary>
/// 查找實體列表
/// /summary>
/// returns>/returns>
public IQueryableT> FindList()
{
return DbContext.SetT>();
}
/// summary>
/// 查找實體列表
/// /summary>
/// typeparam name="TKey">排序建類型/typeparam>
/// param name="order">排序表達式/param>
/// param name="asc">是否正序/param>
/// returns>/returns>
public IQueryableT> FindListTKey>(ExpressionFuncT, TKey>> order, bool asc)
{
return asc ? DbContext.SetT>().OrderBy(order) : DbContext.SetT>().OrderByDescending(order);
}
/// summary>
/// 查找實體列表
/// /summary>
/// typeparam name="TKey">排序鍵類型/typeparam>
/// param name="order">排序鍵/param>
/// param name="asc">是否正序/param>
/// param name="number">獲取的記錄數量/param>
/// returns>/returns>
public IQueryableT> FindListTKey>(ExpressionFuncT, TKey>> order, bool asc,int number)
{
return asc ? DbContext.SetT>().OrderBy(order).Take(number) : DbContext.SetT>().OrderByDescending(order).Take(number);
}
/// summary>
/// 查找實體列表
/// /summary>
/// param name="where">查詢Lambda表達式/param>
/// returns>/returns>
public IQueryableT> FindList(ExpressionFuncT, bool>> where)
{
return DbContext.SetT>().Where(where);
}
/// summary>
/// 查找實體列表
/// /summary>
/// param name="where">查詢Lambda表達式/param>
/// param name="number">獲取的記錄數量/param>
/// returns>/returns>
public IQueryableT> FindList(ExpressionFuncT, bool>> where, int number)
{
return DbContext.SetT>().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 IQueryableT> FindListTKey>(ExpressionFuncT, bool>> where, ExpressionFuncT, TKey>> order, bool asc)
{
return asc ? DbContext.SetT>().Where(where).OrderBy(order) : DbContext.SetT>().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">獲取的記錄數量/param>
/// returns>/returns>
public IQueryableT> FindListTKey>(ExpressionFuncT, bool>> where, ExpressionFuncT, TKey>> order, bool asc, int number)
{
return asc ? DbContext.SetT>().Where(where).OrderBy(order).Take(number) : DbContext.SetT>().Where(where).OrderByDescending(order).Take(number);
}
5、查找實體分頁列表方法FindPageList
根據需要FindPageList進行多次重載
/// summary>
/// 查找分頁列表
/// /summary>
/// param name="pageSize">每頁記錄數。必須大于1/param>
/// param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1/param>
/// param name="totalNumber">總記錄數/param>
/// returns>/returns>
public IQueryableT> FindPageList(int pageSize, int pageIndex, out int totalNumber)
{
if (pageIndex 1) pageIndex = 1;
if (pageSize 1) pageSize = 10;
IQueryableT> _list = DbContext.SetT>();
totalNumber = _list.Count();
return _list.Skip((pageIndex - 1) * pageIndex).Take(pageSize);
}
/// summary>
/// 查找分頁列表
/// /summary>
/// param name="pageSize">每頁記錄數。必須大于1/param>
/// param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1/param>
/// param name="totalNumber">總記錄數/param>
/// param name="order">排序鍵/param>
/// param name="asc">是否正序/param>
/// returns>/returns>
public IQueryableT> FindPageListTKey>(int pageSize, int pageIndex, out int totalNumber, ExpressionFuncT, TKey>> order, bool asc)
{
if (pageIndex 1) pageIndex = 1;
if (pageSize 1) pageSize = 10;
IQueryableT> _list = DbContext.SetT>();
_list = asc ? _list.OrderBy(order) : _list.OrderByDescending(order);
totalNumber = _list.Count();
return _list.Skip((pageIndex - 1) * pageIndex).Take(pageSize);
}
/// summary>
/// 查找分頁列表
/// /summary>
/// param name="pageSize">每頁記錄數。必須大于1/param>
/// param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1/param>
/// param name="totalNumber">總記錄數/param>
/// param name="where">查詢表達式/param>
public IQueryableT> FindPageList(int pageSize, int pageIndex, out int totalNumber, ExpressionFuncT, bool>> where)
{
if (pageIndex 1) pageIndex = 1;
if (pageSize 1) pageSize = 10;
IQueryableT> _list = DbContext.SetT>().Where(where);
totalNumber = _list.Count();
return _list.Skip((pageIndex - 1) * pageIndex).Take(pageSize);
}
/// summary>
/// 查找分頁列表
/// /summary>
/// param name="pageSize">每頁記錄數。必須大于1/param>
/// param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1/param>
/// param name="totalNumber">總記錄數/param>
/// param name="where">查詢表達式/param>
/// param name="order">排序鍵/param>
/// param name="asc">是否正序/param>
public IQueryableT> FindPageListTKey>(int pageSize, int pageIndex, out int totalNumber, ExpressionFuncT, bool>> where, ExpressionFuncT, TKey>> order, bool asc)
{
if (pageIndex 1) pageIndex = 1;
if (pageSize 1) pageSize = 10;
IQueryableT> _list = DbContext.SetT>().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>受影響的對象的數目/returns>
public int Add(T entity)
{
return Add(entity, true);
}
/// summary>
/// 添加實體
/// /summary>
/// param name="entity">實體/param>
/// param name="isSave">是否立即保存/param>
/// returns>在“isSave”為True時返回受影響的對象的數目,為False時直接返回0/returns>
public int Add(T entity,bool isSave)
{
DbContext.SetT>().Add(entity);
return isSave ? DbContext.SaveChanges() : 0;
}
7、更新實體方法Update
Updae 方法有一個重載,重載方法可以選擇是否立即保存
#region Update
/// summary>
/// 更新實體【立即保存】
/// /summary>
/// param name="entity">實體/param>
/// returns>在“isSave”為True時返回受影響的對象的數目,為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時返回受影響的對象的數目,為False時直接返回0/returns>
public int Update(T entity, bool isSave)
{
DbContext.SetT>().Attach(entity);
DbContext.EntryT>(entity).State = EntityState.Modified;
return isSave ? DbContext.SaveChanges() : 0;
}
8、刪除實體方法Delete
Delete 方法有兩個重載,一個是可以選擇否立即保存,另一個是批量刪除
/// summary>
/// 刪除實體【立即保存】
/// /summary>
/// param name="entity">實體/param>
/// returns>受影響的對象的數目/returns>
public int Delete(T entity)
{
return Delete(entity, true);
}
/// summary>
/// 刪除實體
/// /summary>
/// param name="entity">實體/param>
/// param name="isSave">是否立即保存/param>
/// returns>在“isSave”為True時返回受影響的對象的數目,為False時直接返回0/returns>
public int Delete(T entity,bool isSave)
{
DbContext.SetT>().Remove(entity);
return isSave ? DbContext.SaveChanges() : 0;
}
/// summary>
/// 批量刪除實體
/// /summary>
/// param name="entities">實體集合/param>
/// returns>受影響的對象的數目/returns>
public int Delete(IEnumerableT> entities)
{
DbContext.SetT>().RemoveRange(entities);
return DbContext.SaveChanges();
}
9、統計記錄數方法Count
Count 方法有一個重載,可以根據表達式進行統計
/// summary>
/// 記錄數
/// /summary>
/// returns>/returns>
public int Count()
{
return DbContext.SetT>().Count();
}
/// summary>
/// 記錄數
/// /summary>
/// param name="predicate">表達式/param>
/// returns>/returns>
public int Count(ExpressionFuncT, bool>> predicate)
{
return DbContext.SetT>().Count(predicate);
}
10、是否存在
/// summary>
/// 記錄是否存在
/// /summary>
/// param name="predicate">表達式/param>
/// returns>/returns>
public bool IsContains(ExpressionFuncT, bool>> predicate)
{
return Count(predicate) > 0;
}
11、保存到數據庫
/// summary>
/// 保存數據【在Add、Upate、Delete未立即保存的情況下使用】
/// /summary>
/// returns>受影響的記錄數/returns>
public int Save()
{
return DbContext.SaveChanges();
}
您可能感興趣的文章:- IIS7/IIS7.5/IIS8網站目錄執行權限設置方法(與IIS6不同)
- Win2008 R2中IIS7.5配置完網站權限不足問題的解決方法
- IIS PHP環境Temp文件夾的權限問題引起的網站故障
- win2003 IIS虛擬主機網站防木馬、權限設置、安全配置整理
- Apache Wind2003 配置網站目錄權限小結
- ASP.NET MVC5網站開發之登錄、驗證和注銷管理員篇1(六)
- vs2010制作簡單的asp.net網站
- 如何對ASP.NET網站實現靜態化
- ASP.NET MVC5網站開發管理列表、回復及刪除(十三)
- MVC網站開發之權限管理篇