MVC5 網站開發之三 數據存儲層功能實現


數據存儲層在項目Ninesky.DataLibrary中實現,整個項目只有一個類Repository

 

目錄

奔跑吧,代碼小哥!

MVC5網站開發之一 總體概述

MVC5 網站開發之二 創建項目

MVC5 網站開發之三 數據存儲層功能實現

MVC5 網站開發之四 業務邏輯層的架構和基本功能

MVC5 網站開發之五 展示層架構

MVC5 網站開發之六 管理員 1、登錄、驗證和注銷

MVC5 網站開發之六 管理員 2、添加、刪除、重置密碼、修改密碼、列表瀏覽

MVC5 網站開發之七 用戶功能 1、角色的后台管理

 

Repository中實現增刪改查詢等方法供業務邏輯層調用,主要功能如下圖:

image

具體步驟

一、添加實體框架的引用。

image

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

image

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

 

image

在搜索框輸入EntityFramework.zh-Hans,安裝假體中文資源包。

二、實現數據倉儲類

打開解決方案,選擇項目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、構造函數

為類中添加夠高函數,可以直接傳遞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.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

根據需要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">獲取的記錄數量</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">獲取的記錄數量</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">獲取的記錄數量</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

根據需要FindPageList進行多次重載

/// <summary>
        /// 查找分頁列表
        /// </summary>
        /// <param name="pageSize">每頁記錄數。必須大於1</param>
        /// <param name="pageIndex">頁碼。首頁從1開始,頁碼必須大於1</param>
        /// <param name="totalNumber">總記錄數</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">每頁記錄數。必須大於1</param>
        /// <param name="pageIndex">頁碼。首頁從1開始,頁碼必須大於1</param>
        /// <param name="totalNumber">總記錄數</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">每頁記錄數。必須大於1</param>
        /// <param name="pageIndex">頁碼。首頁從1開始,頁碼必須大於1</param>
        /// <param name="totalNumber">總記錄數</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">每頁記錄數。必須大於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 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>受影響的對象的數目</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.Set<T>().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.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>受影響的對象的數目</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.Set<T>().Remove(entity);
            return isSave ? DbContext.SaveChanges() : 0;
        }

        /// <summary>
        /// 批量刪除實體
        /// </summary>
        /// <param name="entities">實體集合</param>
        /// <returns>受影響的對象的數目</returns>
        public int Delete(IEnumerable<T> entities)
        {
            DbContext.Set<T>().RemoveRange(entities);
            return DbContext.SaveChanges();
        }

9、統計記錄數方法Count

Count 方法有一個重載,可以根據表達式進行統計

/// <summary>
        /// 記錄數
        /// </summary>
        /// <returns></returns>
        public int Count()
        {
            return DbContext.Set<T>().Count();
        }

        /// <summary>
        /// 記錄數
        /// </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、保存到數據庫

/// <summary>
        /// 保存數據【在Add、Upate、Delete未立即保存的情況下使用】
        /// </summary>
        /// <returns>受影響的記錄數</returns>
        public int Save()
        {
            return DbContext.SaveChanges();
        }

===================================

代碼見https://ninesky.codeplex.com/SourceControl/latest#Ninesky/Ninesky.DataLibrary/Repository.cs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM