构建一个仓储模式。

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. JsonUtils序列化与反序列化工具

    直接见代码,需要引入的包如下文,需要谷歌的包. package com.cxf.value; import com.fasterxml.jackson.core.type.TypeReference; ...

  2. odoo11新开发功能模块测试指南

    根据实际业务需要,我们开发了一些生产实务中一些功能模块,作为制造行业管理信息化解决方案的基础,并应部分客户需求,做了测试系统,现将测试方式公布如下: 一.测试环境 服务器地址 http://106.1 ...

  3. 转载:(原创)odoo11配置邮件功能的那些事儿

    https://www.cnblogs.com/goyier/p/9246001.html 关于odoo的邮件服务器的配置,百度的结果是众说纷纭,但是都没有能够清楚的说明,odoo系统的邮件功能,仅仅 ...

  4. C# LINQ 详解 From Where Select Group Into OrderBy Let Join

    目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...

  5. [Spark][Python]DataFrame where 操作例子

    [Spark][Python]DataFrame中取出有限个记录的例子 的 继续 [15]: myDF=peopleDF.where("age>21") In [16]: m ...

  6. Nginx Windows版的服务安装和管理工具

    以前研究过负载均衡,最近正在项目上实施(从来没做过小项目以上级别的东西,哈),nginx挺好,不过Windows有点为难,小流量和本地不追求性能,简单易用是目标. Nginx Windows上并没有提 ...

  7. hexo——轻量、简易、高逼格的博客

    背景 写blog虽然经历了N多不同时代的产品,恒久不变的始终是自己无人问津的网站.虽然没几个人看,还是隔断时间就要折腾一下.从最开始的wordpress,到tale,到现在的hexo,网站变得越来越简 ...

  8. LVM : 扩展文件系统的容量

    如果发现文件系统的容量不足了,可以通过 LVM 轻松的进行扩展(当然也可以进行缩减操作).本文将紧接前文中的 demo 详细的介绍扩展文件系统的操作过程.说明:本文的演示环境为 ubuntu 16.0 ...

  9. Spring Cloud :断路器集群监控(Turbine)

    一. 简介      上一篇文章我们已经实现了对单个服务实例的监控,当然在实际应用中,单个实例的监控数据没有多大的价值,我们更需要的是一个集群系统的监控信息,这时我们就需要引入Turbine.Turb ...

  10. 自己搭建的一个react脚手架

    包括了: react.react router(v4), webpack(v4),echarts, google的组件库material ui, 后期会加上redux但是这些做中小型系统已经够了,de ...