数据存储层在项目Ninesky.DataLibrary中实现,整个项目只有一个类Repository。

 

目录

奔跑吧,代码小哥!

MVC5网站开发之一 总体概述

MVC5 网站开发之二 创建项目

MVC5 网站开发之三 数据存储层功能实现

MVC5 网站开发之四 业务逻辑层的架构和基本功能

MVC5 网站开发之五 展示层架构

MVC5 网站开发之六 管理员 1、登录、验证和注销

MVC5 网站开发之六 管理员 2、添加、删除、重置密码、修改密码、列表浏览

MVC5 网站开发之七 用户功能 1、角色的后台管理

 

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 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

MVC5 网站开发之三 数据存储层功能实现的更多相关文章

  1. MVC5 网站开发之四 业务逻辑层的架构和基本功能

    业务逻辑层在Ninesky.Core中实现,主要功能封装一些方法通过调用数据存储层,向界面层提供服务.   目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 ...

  2. MVC5 网站开发之七 用户功能 1、角色的后台管理

    角色是网站中都有的一个功能,用来区分用户的类型.划分用户的权限,这次实现角色列表浏览.角色添加.角色修改和角色删除. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 ...

  3. MVC5 网站开发之七 用户功能 2 用户添加和浏览

    目录 MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网站开发之五 展示层架 ...

  4. MVC5 网站开发之七 用户功能 3用户资料的修改和删除

    这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和& ...

  5. MVC5 网站开发之八 栏目功能 添加、修改和删除

    本次实现栏目的浏览.添加.修改和删除. 栏目一共有三种类型. 常规栏目-可以添加子栏目,也可以添加内容模型.当不选择内容模型时,不能添加内容. 单页栏目-栏目只有一个页面,可以设置视图. 链接栏目-栏 ...

  6. MVC5 网站开发之九 网站设置

    网站配置一般用来保存网站的一些设置,写在配置文件中比写在数据库中要合适一下,因为配置文件本身带有缓存,随网站启动读入缓存中,速度更快,而保存在数据库中要单独为一条记录创建一个表,结构不够清晰,而且读写 ...

  7. MVC5网站开发之一 总体概述

    由于前几次都没能写完,这次年底总算有自由时间了,又想继续捣鼓一下.于是下载了VS 2015专业版(不知为什么我特别钟爱专业版,而不喜欢企业版).由于以前的教训,我这次决定写一个极简的Deom,简到什么 ...

  8. MVC5 网站开发之二 创建项目

    昨天对项目的思路大致理了一下,今天先把解决方案建立起来.整个解决包含Ninesky.Web.Ninesky.Core,Ninesky.DataLibrary等3个项目.Ninesky.Web是web应 ...

  9. MVC5 网站开发之五 展示层架构

    展示层由Ninesky.Web项目实现,负责网站内容的显示,项目包含Member和Control两个区域.   目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项 ...

随机推荐

  1. C#为IE编写BHO插件心得

    啥是BHO,其实大家都用过,没听过只是没在意而已,来张图你就知道是什么了 是不是很熟悉,就是这么个玩意~~ 先说说我要用来干嘛~我们有个库,里面数据很全面,但是某个部门需要在第三方的B/S系统录入某些 ...

  2. Visual Studio 2012远程调试中遇到的问题

    有的时候开发环境没问题的代码在生产环境中会某些开发环境无法重现的问题,或者需要对生产环境代码进行远程调试该怎么办? Vs已经提供给开发者远程调试的工具 下面简单讲讲该怎么用,前期准备:1.本地登录账户 ...

  3. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

  4. 获取微软原版“Windows 10 推送器(GWX)” 卸载工具

    背景: 随着Windows 10 免费更新的结束,针对之前提供推送通知的工具(以下简称GWX)来说使命已经结束,假设您还未将Windows 8.1 和Windows 7 更新到Windows 10 的 ...

  5. AI人工智能系列随笔:syntaxnet 初探(1)

    人工智能是 最近的一个比较火的名词,相信大家对于阿尔法狗都不陌生吧?其实我对人工智能以前也是非常抵触的,因为我认为机器人会取代人类,成为地球乃至宇宙的霸主,但是人工智能带给我的这种冲击,我个人感觉是欲 ...

  6. 在Windows上编译和调试CoreCLR

    生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7+ Visual studio 2015 确保C++ 工具已经被安装,默认是不安装 ...

  7. 从c#角度看万能密码SQL注入漏洞

    以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理. 今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事. 众所周知的万能密码SQL注入漏洞, ...

  8. JS魔法堂:不完全国际化&本地化手册 之 理論篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  9. 一行代码实现java list去重

    1.不带类型写法: 1 List listWithoutDup = new ArrayList(new HashSet(listWithDup)); 2.带类型写法(以String类型为例):1)Ja ...

  10. FineBI:一个简单易用的自助BI工具

    过去,有关企业数据分析的重担都压在IT部门,传统BI分析更多面向的是具有IT背景的人员.但随着业务分析需求的增加,很多公司都希望为业务用户提供自助分析服务,将分析工作落实到业务人员手中.但同时,分析工 ...