MVC5 网站开发之三 数据存储层功能实现
数据存储层在项目Ninesky.DataLibrary中实现,整个项目只有一个类Repository。
目录
MVC5 网站开发之六 管理员 2、添加、删除、重置密码、修改密码、列表浏览
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 网站开发之三 数据存储层功能实现的更多相关文章
- MVC5 网站开发之四 业务逻辑层的架构和基本功能
业务逻辑层在Ninesky.Core中实现,主要功能封装一些方法通过调用数据存储层,向界面层提供服务. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 ...
- MVC5 网站开发之七 用户功能 1、角色的后台管理
角色是网站中都有的一个功能,用来区分用户的类型.划分用户的权限,这次实现角色列表浏览.角色添加.角色修改和角色删除. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 ...
- MVC5 网站开发之七 用户功能 2 用户添加和浏览
目录 MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网站开发之五 展示层架 ...
- MVC5 网站开发之七 用户功能 3用户资料的修改和删除
这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和& ...
- MVC5 网站开发之八 栏目功能 添加、修改和删除
本次实现栏目的浏览.添加.修改和删除. 栏目一共有三种类型. 常规栏目-可以添加子栏目,也可以添加内容模型.当不选择内容模型时,不能添加内容. 单页栏目-栏目只有一个页面,可以设置视图. 链接栏目-栏 ...
- MVC5 网站开发之九 网站设置
网站配置一般用来保存网站的一些设置,写在配置文件中比写在数据库中要合适一下,因为配置文件本身带有缓存,随网站启动读入缓存中,速度更快,而保存在数据库中要单独为一条记录创建一个表,结构不够清晰,而且读写 ...
- MVC5网站开发之一 总体概述
由于前几次都没能写完,这次年底总算有自由时间了,又想继续捣鼓一下.于是下载了VS 2015专业版(不知为什么我特别钟爱专业版,而不喜欢企业版).由于以前的教训,我这次决定写一个极简的Deom,简到什么 ...
- MVC5 网站开发之二 创建项目
昨天对项目的思路大致理了一下,今天先把解决方案建立起来.整个解决包含Ninesky.Web.Ninesky.Core,Ninesky.DataLibrary等3个项目.Ninesky.Web是web应 ...
- MVC5 网站开发之五 展示层架构
展示层由Ninesky.Web项目实现,负责网站内容的显示,项目包含Member和Control两个区域. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项 ...
随机推荐
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
- ASP.NET_各个币种之间的汇率转换(实时)使用Yahoo汇率。
近期开发支付平台的时候有运用到各国的实时汇率之间的转换问题,于是在往上找了很多相关资料,以下就是一些参考网址: 1.提供API接口的网站:https://www.showapi.com:这个网站有提供 ...
- 简谈百度坐标反转至WGS84的三种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图 ...
- html中如何添加提示信息
提示:在标签中添加title属性 1.文本中如何添加提示信息? 1.1直接在标签中加title="值": 例如:<p title="爱笑,爱哭,爱生活"& ...
- 以bank account 数据为例,认识elasticsearch query 和 filter
Elasticsearch 查询语言(Query DSL)认识(一) 一.基本认识 查询子句的行为取决于 query context filter context 也就是执行的是查询(query)还是 ...
- ajax异步请求
做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...
- PHP 获取 特定时间范围 类
目录 前序 用途 功能及事项 使用方法 代码及注释 前序: 总体来说,我更应该是一个 android 移动开发者,而不是一个 phper,如果说只做移动端的 APP ,我也不会学这么多,这 2年来, ...
- node中子进程同步输出
管道 通过"child_process"模块fork出来的子进程都是返回一个ChildProcess对象实例,ChildProcess类比较特殊无法手动创建该对象实例,只能使用fo ...
- 【置顶】CoreCLR系列随笔
CoreCLR配置系列 在Windows上编译和调试CoreCLR GC探索系列 C++随笔:.NET CoreCLR之GC探索(1) C++随笔:.NET CoreCLR之GC探索(2) C++随笔 ...
- Java获取本机的IP与MAC地址
有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...