构建一个仓储模式。

Model

大家自己创建就行了,上个图,就不多说了(我是code first)

IDAL

namespace IDAL
{
public interface IBaseRepository<T>
{
/// <summary>
/// 添加
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>添加后的数据实体</returns>
T Add(T entity); /// <summary>
/// 添加
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>添加后的数据实体</returns>
bool AddOK(T entity); /// <summary>
/// 查询记录数
/// </summary>
/// <param name="predicate">条件表达式</param>
/// <returns>记录数</returns>
int Count(Expression<Func<T, bool>> predicate); /// <summary>
/// 更新
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>是否成功</returns>
T Update(T entity); /// <summary>
/// 更新
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>是否成功</returns>
bool UpdateOK(T entity); /// <summary>
/// 删除
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>是否成功</returns>
bool Delete(T entity); /// <summary>
/// 是否存在
/// </summary>
/// <param name="anyLambda">查询表达式</param>
/// <returns>布尔值</returns>
bool Exist(Expression<Func<T, bool>> anyLambda); /// <summary>
/// 查询数据
/// </summary>
/// <param name="whereLambda">查询表达式</param>
/// <returns>实体</returns>
T Find(Expression<Func<T, bool>> whereLambda); /// <summary>
/// 查找数据列表
/// </summary>
/// <typeparam name="S">排序</typeparam>
/// <param name="whereLamdba">查询表达式</param>
/// <returns></returns>
IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba); /// <summary>
/// 查找数据列表
/// </summary>
/// <typeparam name="S">排序</typeparam>
/// <param name="whereLamdba">查询表达式</param>
/// <param name="isAsc">是否升序</param>
/// <param name="orderLamdba">排序表达式</param>
/// <returns></returns>
IQueryable<T> FindList<S>(Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLamdba); /// <summary>
/// 查找分页数据列表
/// </summary>
/// <typeparam name="S">排序</typeparam>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">每页记录数</param>
/// <param name="totalRecord">总记录数</param>
/// <param name="whereLamdba">查询表达式</param>
/// <param name="isAsc">是否升序</param>
/// <param name="orderLamdba">排序表达式</param>
/// <returns></returns>
IQueryable<T> FindPageList<S>(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLamdba); List<T> FindListBySQL<T>(string sql, params object[] parameters); int ExecuteBySQL(string sql, params object[] parameters);
}
}

IBLL

这里我就偷懒了(直接拷贝了idal),业务层实际可以根据自己需求封装
namespace IBLL
{
public interface IBaseRepositoryBLL<T> where T:class
{
/// <summary>
/// 添加
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>添加后的数据实体</returns>
T Add(T entity); /// <summary>
/// 添加
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>添加后的数据实体</returns>
bool AddOK(T entity); /// <summary>
/// 查询记录数
/// </summary>
/// <param name="predicate">条件表达式</param>
/// <returns>记录数</returns>
int Count(Expression<Func<T, bool>> predicate); /// <summary>
/// 更新
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>是否成功</returns>
T Update(T entity); /// <summary>
/// 更新
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>是否成功</returns>
bool UpdateOK(T entity); /// <summary>
/// 删除
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>是否成功</returns>
bool Delete(T entity); /// <summary>
/// 是否存在
/// </summary>
/// <param name="anyLambda">查询表达式</param>
/// <returns>布尔值</returns>
bool Exist(Expression<Func<T, bool>> anyLambda); /// <summary>
/// 查询数据
/// </summary>
/// <param name="whereLambda">查询表达式</param>
/// <returns>实体</returns>
T Find(Expression<Func<T, bool>> whereLambda); /// <summary>
/// 查找数据列表
/// </summary>
/// <typeparam name="S">排序</typeparam>
/// <param name="whereLamdba">查询表达式</param>
/// <returns></returns>
IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba); /// <summary>
/// 查找数据列表
/// </summary>
/// <typeparam name="S">排序</typeparam>
/// <param name="whereLamdba">查询表达式</param>
/// <param name="isAsc">是否升序</param>
/// <param name="orderLamdba">排序表达式</param>
/// <returns></returns>
IQueryable<T> FindList<S>(Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLamdba); /// <summary>
/// 查找分页数据列表
/// </summary>
/// <typeparam name="S">排序</typeparam>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">每页记录数</param>
/// <param name="totalRecord">总记录数</param>
/// <param name="whereLamdba">查询表达式</param>
/// <param name="isAsc">是否升序</param>
/// <param name="orderLamdba">排序表达式</param>
/// <returns></returns>
IQueryable<T> FindPageList<S>(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLamdba); List<T> FindListBySQL<T>(string sql, params object[] parameters);
int ExecuteBySQL(string sql, params object[] parameters);
}

以上工作做完后,我们开始准备  DAL和 BLL了。

分别创建DAL和 BLL类库。(你要是文件夹,也无所谓)

DAL

先来一个图形象一点

(截图中,大家可能看到了BaseRespositoryRedis.cs 顾名思义,不解释了。下一章我贴代码吧。其实也没什么好说的)

ELDBEntity.cs(其实就是我们的 DBContext,不多说了吧)

namespace DAL.DBContext
{
public class ELDBEntity : DbContext
{
public ELDBEntity()
: base("name=Entities")
{
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{ } public DbSet<SYS_User> SYS_User { get; set; }
public DbSet<SYS_UserAccess> SYS_UserAccess { get; set; } }
}

DbContextFactory

这个文件,稍微介绍一下,

主要是为了让每一个用户,从始至终只使用自己的dbcontext。

简单点说,每个用户都会有属于自己的dbcontext。但是只会有一个,不会有多个。

代码:

namespace DAL
{
public class DbContextFactory
{
public static ELDBEntity GetCurrentContext()
{
ELDBEntity _nContext = CallContext.GetData("ELDBEntity") as ELDBEntity;
if (_nContext == null)
{
_nContext = new ELDBEntity();
CallContext.SetData("ELDBEntity", _nContext);
} return _nContext;
}
}
}

BaseRepository.cs:

由于我封装了 分页方法,所有添加了Webdiyer.WebControls.Mvc引用,

大家可以通过nuget 查找MvcPager 添加这个dll

不喜欢的童鞋,自行删除。

另外,我封装了通过sql语句来增删改查。

using Webdiyer.WebControls.Mvc;
namespace DAL.Base
{
public class BaseRepository<T> :BaseClass, IBaseRepository<T> where T: class
{
public ELDBEntity dbEF = DbContextFactory.GetCurrentContext();
//public ELDBEntity dbEF = ELDBEntity(); public virtual T Add(T entity)
{
dbEF.Entry<T>(entity).State = EntityState.Added;
dbEF.SaveChanges();
return entity;
} public virtual bool AddOK(T entity)
{
dbEF.Entry<T>(entity).State = EntityState.Added;
return dbEF.SaveChanges() > 0;
} public virtual int Count(Expression<Func<T, bool>> predicate)
{
return dbEF.Set<T>().AsNoTracking().Count(predicate);
} public virtual T Update(T entity)
{
dbEF.Set<T>().Attach(entity);
dbEF.Entry<T>(entity).State = EntityState.Modified;
dbEF.SaveChanges();
return entity;
} public virtual bool UpdateOK(T entity)
{
dbEF.Set<T>().Attach(entity);
dbEF.Entry<T>(entity).State = EntityState.Modified;
return dbEF.SaveChanges() > 0;
} public virtual bool Delete(T entity)
{
dbEF.Set<T>().Attach(entity);
dbEF.Entry<T>(entity).State = EntityState.Deleted; return dbEF.SaveChanges() > 0;
} public virtual bool Exist(Expression<Func<T, bool>> anyLambda)
{
return dbEF.Set<T>().AsNoTracking().Any(anyLambda);
} public virtual T Find(Expression<Func<T, bool>> whereLambda)
{
T _entity = dbEF.Set<T>().AsNoTracking().FirstOrDefault<T>(whereLambda);
return _entity;
} public virtual IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba)
{
var _list = dbEF.Set<T>().AsNoTracking().Where<T>(whereLamdba);
return _list;
} public virtual IQueryable<T> FindList<S>(Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLamdba)
{
var _list = dbEF.Set<T>().AsNoTracking().Where<T>(whereLamdba);
if (isAsc) _list = _list.OrderBy<T, S>(orderLamdba);
else _list = _list.OrderByDescending<T, S>(orderLamdba);
return _list;
} public virtual IQueryable<T> FindPageList<S>(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLamdba)
{
var _list = dbEF.Set<T>().AsNoTracking().Where<T>(whereLamdba);
totalRecord = _list.Count();
if (isAsc) _list = _list.OrderBy<T, S>(orderLamdba).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize);
else _list = _list.OrderByDescending<T, S>(orderLamdba).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize);
return _list;
}
public virtual PagedList<T> FindPageList1<S>(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLamdba)
{
var _list = dbEF.Set<T>().AsNoTracking().Where<T>(whereLamdba);
totalRecord = _list.Count();
PagedList<T> resultList = null;
if (isAsc) resultList = _list.OrderBy<T, S>(orderLamdba).ToPagedList(pageIndex,pageSize);
else resultList = _list.OrderByDescending<T, S>(orderLamdba).ToPagedList(pageIndex, pageSize);
return resultList;
} public virtual List<T> FindListBySQL<T>(string sql, params object[] parameters)
{
var list = dbEF.Database.SqlQuery<T>(sql, parameters).ToList();
return list;
} public virtual int ExecuteBySQL(string sql, params object[] parameters)
{
var q = dbEF.Database.ExecuteSqlCommand(sql, parameters);
return q;
}
}
}

BLL

BaseRepositoryBLL.cs
namespace BLL.Base
{
public class BaseRepositoryBLL<T> :BaseClass, IBaseRepositoryBLL<T> where T:class
{
BaseRepository<T> obj = new BaseRepository<T>();
public virtual T Add(T entity)
{
return obj.Add(entity);
} public virtual bool AddOK(T entity)
{
return obj.AddOK(entity);
} public virtual int Count(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
return obj.Count(predicate);
} public virtual T Update(T entity)
{
return obj.Update(entity);
} public virtual bool UpdateOK(T entity)
{
return obj.UpdateOK(entity);
} public virtual bool Delete(T entity)
{
return obj.Delete(entity);
} public virtual bool Exist(System.Linq.Expressions.Expression<Func<T, bool>> anyLambda)
{
return obj.Exist(anyLambda);
} public virtual T Find(Expression<Func<T, bool>> whereLambda)
{
return obj.Find(whereLambda);
} public virtual IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba)
{
var _list = obj.FindList(whereLamdba);
return _list;
} public virtual IQueryable<T> FindList<S>(Expression<Func<T, bool>> whereLamdba, bool isAsc, System.Linq.Expressions.Expression<Func<T, S>> orderLamdba)
{
return obj.FindList<S>(whereLamdba, isAsc, orderLamdba);
} public virtual IQueryable<T> FindPageList<S>(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLamdba)
{
return obj.FindPageList<S>(pageIndex, pageSize, out totalRecord, whereLamdba, isAsc, orderLamdba);
} public virtual PagedList<T> FindPageList1<S>(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLamdba)
{
return obj.FindPageList1<S>(pageIndex, pageSize, out totalRecord, whereLamdba, isAsc, orderLamdba);
} public virtual List<T> FindListBySQL<T>(string sql, params object[] parameters)
{
return obj.FindListBySQL<T>(sql, parameters);
} public virtual int ExecuteBySQL(string sql, params object[] parameters)
{
return obj.ExecuteBySQL(sql, parameters);
}
}
}

调用方式

DAL层:先创建属于某个实体对象的DAL
namespace DAL
{
public class SYS_UserDAL : BaseRepository<SYS_User>
{
/// <summary>
/// 登录
/// </summary>
/// <param name="e"></param>
/// <returns></returns>
//public SYS_User Login(SYS_User u)
//{
// //u.Password = EncryptionClass.MD5_16(e.pwd);
// var q = dbEF.SYS_User.FirstOrDefault(x => x.Password == u.Password && x.Account == u.Account);
// return q; //}
}
}

BLL层:然后创建对应的BLL

namespace BLL
{
public class SYS_UserBLL : BaseRepositoryBLL<SYS_User>
{
SYS_UserDAL dal = new SYS_UserDAL();
/// <summary>
/// 添加账号
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool AddUser(SYS_User entity)
{
return dal.AddOK(entity);
} }
}

ef 仓储模式的更多相关文章

  1. ef 仓储模式 Redis

    接着写一下 上一章提到的 BaseRepositoryRedis.cs 先说说题外话:由于公司希望用到缓存来提高访问速度.那么我理所当然的想到redis. 这个无可厚非.可是当时我们的项目已经开发的差 ...

  2. MVC+EF 理解和实现仓储模式和工作单元模式

    MVC+EF 理解和实现仓储模式和工作单元模式 原文:Understanding Repository and Unit of Work Pattern and Implementing Generi ...

  3. 用MVC5+EF6+WebApi 做一个考试功能(六) 仓储模式 打造EF通用仓储类

    前言 年底工作比较忙,年度总结还没写,项目要上线,回老家过年各种准备.尤其是给长辈给侄子侄女准备礼物头都大了. 原来想年前先出一版能用的,我看有点悬了,尽量先把大体功能弄出来,扔掉一些,保证能考试,然 ...

  4. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  5. 4.在MVC中使用仓储模式进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...

  6. 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  7. ASP.NET Mvc实用框架(一)Ioc、仓储模式和单元工作模式

    Framework.EF 首先看一下这个类库: Extended文件夹存放的是EntityFramework.Extensions这个插件的源代码,没有别的原因,就是本人觉得这个插件挺好的,每次省的下 ...

  8. MVC5+EF6 入门完整教程十一:细说MVC中仓储模式的应用

    摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...

  9. MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用

    摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...

随机推荐

  1. [01] 初识SpringBoot:Hello World

    引用百科的一句话来说,SpringBoot是一款全新框架,设计目的是为了简化新Spring应用的初始搭建以及开发过程. 怎么讲呢,首先要明确的就是SpringBoot不是替代Spring的一种解决方案 ...

  2. 一个比较变态的js传值,Query的bind、ajax闭包、上下文传值

    var getIDNameList = function (list, selected, text, btn, actionUrl, defaultKey, deleteKey, keyName, ...

  3. 在平衡树的海洋中畅游(四)——FHQ Treap

    Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...

  4. Pandas简易入门(一)

    目录: 读取数据 索引 选择数据 简单运算 声明,本文引用于:https://www.dataquest.io/mission/8/introduction-to-pandas (建议阅读原文) Pa ...

  5. Python - 列表解析式

    列表解析——用来动态地创建列表 [expr for iter_var in iterable if cond_expr] 例子一: map(lambda x: x**2, range(6)) [0, ...

  6. linux-镜像下载

    https://blog.csdn.net/sinat_36564972/article/details/81560395 Centos6.5镜像下载 2018年08月10日 11:35:53 深夜搬 ...

  7. [BUAA软工]第1次阅读

    [BUAA软工]第1次阅读 本次作业所属课程: 2019BUAA软件工程 本次作业要求: 第1次个人作业 我在本课程的目标 熟悉和实践软件工程流程,适应团队开发 本次作业的帮助 帮助理解<构建之 ...

  8. Linux内核分析作业 NO.6

    进程的描述和进程的创建 于佳心  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...

  9. HanderBar

    对于java开发,涉及到页面展示时,比较主流的有两种解决方案: 1. struts2+vo+el表达式. 这种方式,重点不在于struts2,而是vo和el表达式,其基本思想是:根据页面需要的信息,构 ...

  10. github心得体会 王倩倩 201303014004 计科高职13-1

    刚开始接触一门语言软件特别无从下手,尤其还是全英文的,真的是很头疼,注册的时候这个就弄了半天,在网上搜了一下教程然后又结合着老师上课讲的内容自己多做了几遍,也算是对github熟悉了,然后学会操作代码 ...