数据存储层在项目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. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  2. .NET 串口通信

    这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...

  3. C#中5步完成word文档打印的方法

    在日常工作中,我们可能常常需要打印各种文件资料,比如word文档.对于编程员,应用程序中文档的打印是一项非常重要的功能,也一直是一个非常复杂的工作.特别是提到Web打印,这的确会很棘手.一般如果要想选 ...

  4. 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~

    一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...

  5. .Net语言 APP开发平台——Smobiler学习日志:手机应用的TextTabBar快速实现方式

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...

  6. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...

  7. const let,console.log('a',a)跟console.log('a'+a)的区别

    const 创建一个只读的常量 let块级作用域 const let重复赋值都会报错 console.log('a',a) a console.log('a'+a) a2 逗号的值会有空格:用加号的值 ...

  8. 跟着老男孩教育学Python开发【第一篇】:初识Python

    Python简介 Python前世今生 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...

  9. hive

    Hive Documentation https://cwiki.apache.org/confluence/display/Hive/Home 2016-12-22  14:52:41 ANTLR  ...

  10. mono for android学习过程系列教程(2)

    接着上一讲继续开始写,今天介绍的是安卓的基本组成结构. 在大多数情况下,MONO FOR ANDROID的命名空间和Android的命名空间 是互相映射的.有时候需要大小写,非字母数字字符的用法以及名 ...