直奔主题了,不那么啰嗦。

一下分三个步骤说明,分别为 dbContext,repository,uow三点

在说之前,先说下O# 因为最近发现还有人在问,其实很好理解,简要说下理解步骤(O#的整体框架和上面的截图类似->_->我就是仿照的o#搭建的好不好)

如果对respository+uow熟练的人 ,一下就能看懂

看图一,图中的Core.Data.Entity

说实话,我也偷懒了,以下是 IRepository和IUnitofWork的定义

IRepository:

/// <summary>///     实现仓储模型的数据标准操作/// </summary>public interface IRepository<TEntity> : IDependency{#region 属性/// <summary>///     获取  当前单元操作对象/// </summary>IUnitOfWork UnitOfWork { get; }/// <summary>///     获取当前实体查询数据集,数据将使用不跟踪变化的方式来查询/// </summary>IQueryable<TEntity> Entites { get; }#endregion#region 方法/// <summary>/// 插入实体/// </summary>/// <param name="entity">实体对象</param>/// <returns>操作影响的行数</returns>int Insert(TEntity entity, bool save = true);/// <summary>/// 批量插入实体/// </summary>/// <param name="entities">实体对象集合</param>/// <returns>操作影响的行数</returns>int Insert(IEnumerable<TEntity> entities, bool save = true);/// <summary>/// 删除实体/// </summary>/// <param name="entity">实体对象</param>/// <returns>操作影响的行数</returns>int Delete(TEntity entity, bool save = true);/// <summary>/// 删除指定编号的实体/// </summary>/// <param name="key">实体主键</param>/// <returns>操作影响的行数</returns>int Delete(object key, bool save = true);/// <summary>/// 删除所有符合特定条件的实体/// </summary>/// <param name="predicate">查询条件谓语表达式</param>/// <returns>操作影响的行数</returns>int Delete(Expression<Func<TEntity, bool>> predicate, bool save = true);/// <summary>/// 批量删除实体/// </summary>/// <param name="entities">实体对象集合</param>/// <returns>操作影响的行数</returns>int Delete(IEnumerable<TEntity> entities, bool save = true);/// <summary>///     更新指定主键的对象/// </summary>/// <param name="key"></param>/// <returns></returns>int Update(object key, bool save = true);/// <summary>/// 更新实体对象/// </summary>/// <param name="entity">更新后的实体对象</param>/// <returns>操作影响的行数</returns>int Update(TEntity entity, bool save = true);/// <summary>///     批量更新数据/// </summary>/// <param name="entites">对象集合</param>/// <returns></returns>int Update(IEnumerable<TEntity> entites, bool save = true);///// <summary>///// 检查实体是否存在///// </summary>///// <param name="predicate">查询条件谓语表达式</param>///// <param name="id">编辑的实体标识</param>///// <returns>是否存在</returns>//bool CheckExists(Expression<Func<TEntity, bool>> predicate, object id);/// <summary>/// 查找指定主键的实体/// </summary>/// <param name="key">实体主键</param>/// <returns>符合主键的实体,不存在时返回null</returns>TEntity GetByKey(object key);/// <summary>/// 查询指定条件的实体/// </summary>/// <param name="predicate">查询表达式</param>/// <returns>符合条件的实体集合</returns>IEnumerable<TEntity> GetByPredicate(Expression<Func<TEntity, bool>> predicate);/// <summary>/// 获取贪婪加载导航属性的查询数据集/// </summary>/// <param name="path">属性表达式,表示要贪婪加载的导航属性</param>/// <returns>查询数据集</returns>IQueryable<TEntity> GetInclude<TProperty>(Expression<Func<TEntity, TProperty>> path);/// <summary>/// 获取贪婪加载多个导航属性的查询数据集/// </summary>/// <param name="paths">要贪婪加载的导航属性名称数组</param>/// <returns>查询数据集</returns>IQueryable<TEntity> GetIncludes(params string[] paths);/// <summary>/// 创建一个原始 SQL 查询,该查询将返回此集中的实体。 /// 默认情况下,上下文会跟踪返回的实体;可通过对返回的 DbRawSqlQuery 调用 AsNoTracking 来更改此设置。 请注意返回实体的类型始终是此集的类型,而不会是派生的类型。 如果查询的一个或多个表可能包含其他实体类型的数据,则必须编写适当的 SQL 查询以确保只返回适当类型的实体。 与接受 SQL 的任何 API 一样,对任何用户输入进行参数化以便避免 SQL 注入攻击是十分重要的。 您可以在 SQL 查询字符串中包含参数占位符,然后将参数值作为附加参数提供。 您提供的任何参数值都将自动转换为 DbParameter。 context.Set(typeof(Blog)).SqlQuery("SELECT * FROM dbo.Posts WHERE Author = @p0", userSuppliedAuthor); 或者,您还可以构造一个 DbParameter 并将它提供给 SqlQuery。 这允许您在 SQL 查询字符串中使用命名参数。 context.Set(typeof(Blog)).SqlQuery("SELECT * FROM dbo.Posts WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));/// </summary>/// <param name="trackEnabled">是否跟踪返回实体</param>/// <param name="sql">SQL 查询字符串。</param>/// <param name="parameters">要应用于 SQL 查询字符串的参数。 如果使用输出参数,则它们的值在完全读取结果之前不可用。 这是由于 DbDataReader 的基础行为而导致的,有关详细信息,请参见 http://go.microsoft.com/fwlink/?LinkID=398589。</param>/// <returns></returns>IEnumerable<TEntity> SqlQuery(string sql, bool trackEnabled = true, params object[] parameters);/// <summary>///     分页数据查询/// </summary>/// <param name="pageCondition">分页和排序条件</param>/// <param name="predicate">数据过滤条件 表达式</param>/// <returns>分页后的数据集合</returns>IQueryable<TEntity> Get(PageCondition pageCondition, Expression<Func<TEntity, bool>> predicate, out int totalRow);#endregion}

IUnitOfWork:

/// <summary>///     /// </summary>public interface IUnitOfWork: IDependency, IDisposable{#region 方法/// <summary>///     命令提交/// </summary>/// <returns>提交操作结果</returns>int SaveChanges(bool save);DbContext DbContext { get; }#endregion}

此处之所以这么定义(只有两个对象),看上一篇关于 repository和uow的关系

对应的repository和uow的实现
repository:

/// <summary>///     仓储/// </summary>public class Repository<TEntity> : IRepository<TEntity> where TEntity : class{#region Fieldsprivate readonly IUnitOfWork _unitOfWork;private readonly DbSet<TEntity> _dbSet;#endregion#region ctor/// <summary>/// 初始化一个<see cref="Repository{TEntity}"/>类型的新实例/// </summary>public Repository(IUnitOfWork unitOfWork){this._unitOfWork = unitOfWork;this._dbSet = _unitOfWork.DbContext.Set<TEntity>();}#endregion#region 属性/// <summary>/// 获取 当前实体类型的查询数据集,数据将使用不跟踪变化的方式来查询/// </summary>public IQueryable<TEntity> Entites { get { return _dbSet.AsNoTracking(); } }/// <summary>/// 获取 当前单元操作对象/// </summary>public IUnitOfWork UnitOfWork { get { return _unitOfWork; } }#endregion#region 方法///// <summary>/////     判断指定表达式条件 的对象是否存在///// </summary>///// <param name="predicate"></param>///// <param name="id"></param>///// <returns></returns>//public bool CheckExists(Expression<Func<TEntity, bool>> predicate, object id)//{//    var entity = _dbSet.Where(predicate).Select(m => )//}/// <summary>/// 删除所有符合特定条件的实体/// </summary>/// <param name="predicate">查询条件谓语表达式</param>/// <returns>操作影响的行数</returns>public int Delete(Expression<Func<TEntity, bool>> predicate, bool save = true){var entities = _dbSet.Where(predicate).AsEnumerable();if (null != entities && entities.Count() > 0){_dbSet.RemoveRange(entities);}return _unitOfWork.SaveChanges(save);}/// <summary>/// 批量删除实体/// </summary>/// <param name="entities">实体对象集合</param>/// <returns>操作影响的行数</returns>public int Delete(IEnumerable<TEntity> entities, bool save = true){if (null != entities && entities.Count() > 0){_dbSet.RemoveRange(entities);}return _unitOfWork.SaveChanges(save);}public int Delete(object key, bool save = true){var entity = _dbSet.Find(key);_dbSet.Remove(entity);return _unitOfWork.SaveChanges(save);}public int Delete(TEntity entity, bool save = true){_dbSet.Remove(entity);return _unitOfWork.SaveChanges(save);}public TEntity GetByKey(object key){return _dbSet.Find(key);}public IEnumerable<TEntity> GetByPredicate(Expression<Func<TEntity, bool>> predicate){return _dbSet.Where(predicate).AsEnumerable();}public IQueryable<TEntity> GetInclude<TProperty>(Expression<Func<TEntity, TProperty>> path){return _dbSet.Include(path);}public IQueryable<TEntity> GetIncludes(params string[] paths){IQueryable<TEntity> sources = null;foreach (var path in paths){sources = _dbSet.Include(path);}return sources;}public int Insert(IEnumerable<TEntity> entities, bool save = true){_dbSet.AddRange(entities);return _unitOfWork.SaveChanges(save);}public int Insert(TEntity entity, bool save = true){_dbSet.Add(entity);return _unitOfWork.SaveChanges(save);}public IEnumerable<TEntity> SqlQuery(string sql, bool trackEnabled = true, params object[] parameters){return trackEnabled? _dbSet.SqlQuery(sql, parameters): _dbSet.SqlQuery(sql, parameters).AsNoTracking();}public int Update(object key, bool save = true){var entity = _dbSet.Find(key);return Update(entity, save);}public int Update(TEntity entity, bool save = true){DbContext context = ((DbContext)_unitOfWork);DbSet<TEntity> dbSet = context.Set<TEntity>();try{DbEntityEntry<TEntity> entry = context.Entry(entity);if (entry.State == EntityState.Detached){dbSet.Attach(entity);entry.State = EntityState.Modified;}}catch (InvalidOperationException ex){throw new Exception(ex.Message);}return _unitOfWork.SaveChanges(save);}public int Update(IEnumerable<TEntity> entites, bool save = true){DbContext context = ((DbContext)_unitOfWork);DbSet<TEntity> dbSet = context.Set<TEntity>();foreach (var entity in entites){try{DbEntityEntry<TEntity> entry = context.Entry(entity);if (entry.State == EntityState.Detached){dbSet.Attach(entity);entry.State = EntityState.Modified;}}catch (InvalidOperationException ex){throw new Exception(ex.Message);}}return _unitOfWork.SaveChanges(save);}public IQueryable<TEntity> Get(PageCondition pageCondition, Expression<Func<TEntity, bool>> predicate, out int totalRow){int totalCount = 0;IQueryable<TEntity> source = _dbSet.Where(predicate);if (pageCondition.SortConditions == null || pageCondition.SortConditions.Length == 0){source = source.OrderBy("Id");}else{int count = 0;IOrderedQueryable<TEntity> orderSource = null;foreach (SortCondition sortCondition in pageCondition.SortConditions){orderSource = count == 0? CollectionPropertySorter<TEntity>.OrderBy(source, sortCondition.SortField, sortCondition.ListSortDirection): CollectionPropertySorter<TEntity>.ThenBy(orderSource, sortCondition.SortField, sortCondition.ListSortDirection);count++;}source = orderSource;totalCount = source.Count();}int pageIndex = pageCondition.PageIndex, pageSize = pageCondition.PageSize;source = source != null? source.Skip((pageIndex - 1) * pageSize).Take(pageSize): Enumerable.Empty<TEntity>().AsQueryable();//IQueryable<TResult> query = source.Select(selector);//return GetKey(query.Expression);totalRow = totalCount;return source;}#endregion}

uow:

/// <summary>///     工作单元实现/// </summary>public class UnitOfWork :  IUnitOfWork{private bool _disposed;private DbContext _dbContext;public UnitOfWork(){this._dbContext = DbContext;}/// <summary>///     数据提交操作/// </summary>/// <returns></returns>public int SaveChanges(bool save){if (save){try{try{return _dbContext.SaveChanges();}catch (DbEntityValidationException dbex){throw;}}catch (Exception ex){throw;}}return 0;}public  DbContext DbContext{get{//CallContext:是线程内部唯一的独用的数据槽(一块内存空间)//传递DbContext进去获取实例的信息,在这里进行强制转换。DbContext dbContext = CallContext.GetData("DbContext") as DbContext;if (dbContext == null)  //线程在数据槽里面没有此上下文
                {dbContext = new InnovatorContext(); //如果不存在上下文的话,创建一个EF上下文//我们在创建一个,放到数据槽中去CallContext.SetData("DbContext", dbContext);}return dbContext;}}public virtual void Dispose(bool disposing){if (!this._disposed)if (disposing)this._dbContext.Dispose();this._disposed = true;}public void Dispose(){Dispose(true);}}

脚本中涉及到的 SortDirection源自O#的干货中的实现,具体参见 o#

至此,该内容已完毕,以上实现院子处处有,再说闲的多余了。

转载于:https://www.cnblogs.com/Tmc-Blog/p/5061414.html

mvc5 + ef6 + autofac搭建项目(repository+uow)(一)相关推荐

  1. mvc5 + ef6 + autofac搭建项目(三)

    前面已经基本完成了框架的搭建,后面就是实现了,后面主要说下前端的东西bootstrap的使用和相关插件. 看图: 实现比较简单,在主页面只引入共用部分的 js等相关包,毕竟不是所有页面都需要列表以及其 ...

  2. .net MVC5+EF6+bootstrap搭建框架,从入门到精通(三)——之(Bootstrap Fileinput)多图片上传

    .net MVC5+EF6+bootstrap搭建框架,从入门到精通(三)--之(Bootstrap Fileinput)多图片上传 前言废话 .net mvc 实战多图片上传 前言废话 人生最大的b ...

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

    MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 原文:MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. ...

  4. 视频教程-MVC5+EF6之巧租房系统-.NET

    MVC5+EF6之巧租房系统 5年C#相关的开发经验. 工作期间先后服务于公安系统.检察院系统和铁路系统,主导开发过指挥中心三台合一接处警系统.综合指挥调度系统.邹忌预案系统. 检察院案件评查系统.司 ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 日程管理   http:// ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统

    ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...) 开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联 ...

  7. MVC5+EF6 入门完整教程十

    原文:MVC5+EF6 入门完整教程十 本篇是第一阶段的完结篇. 学完这篇后,你应该可以利用MVC进行完整项目的开发了. 本篇主要讲述多表关联数据的更新,以及如何使用原生SQL. 文章提纲 多表关联数 ...

  8. mvc5 ef6 mysql_[实战]MVC5+EF6+MySql企业网盘实战(17)——思考2

    写在前面 今天吃饭回来,突然有一个更好的想法,这里做一下记录. 系列文章 [实战]MVC5+EF6+MySql企业网盘实战(17)--思考2 思路 平时如果要获取电脑上的文件,大都会采用递归的方式,所 ...

  9. java mvc ef_一个简单MVC5 + EF6示例分享

    本文所使用的软件及环境: Visual Studio Ultimate 2013; MVC5 + EF6 + .NET Framework 4.5 + LocalDB;Windows 7 x64 Pr ...

最新文章

  1. 洛谷 - P1886 滑动窗口(单调队列/线段树)
  2. java awt 按钮响应_Java AWT按钮
  3. Bootstrap简介、下载bootstrap及引入文件说明、响应式容器和满屏容器、栅格系统
  4. QQ尾巴病毒的Visual C++实现探讨
  5. QQ空间小秘书 V1.70 Beta1 ~~ 天空原创软件
  6. edge安装包_Chromium版Edge浏览器将支持多平台,Windows版支持IE模式
  7. idea导入项目常见异常处理
  8. x86_64-linux-gnu/libgdk-x11-2.0.so: error adding symbols: DSO missing from command line
  9. SpringBoot拦截器和过滤器的一起使用
  10. 笔记本的计算机打开没有硬盘分区,电脑开机找不到(没有)活动分区怎么办?4个解决方法!...
  11. 基于Java SpringBoot的电影院管理系统设计与实现毕业设计源码011633
  12. outlook2013升级_Microsoft Outlook 2013入门指南
  13. 北大计算机学霸,揭秘:2018北大在京录取的学霸们有何特长(组图)
  14. 工商银行携手数美科技,赋能数字化业务高质量发展
  15. 2021高考成绩查询怎么查小分,2021微信哪个小程序可以查成绩 高考成绩怎么查
  16. 【PAT乙级】1096 大美数 (15 分) DFS回溯解法
  17. 计算机一级office软件,计算机一级office
  18. 是什么让区块链游戏变的“好玩”
  19. 腾讯云轻量级服务器端口开放无法访问
  20. 【斐波那契数列】10题-斐波那契数列

热门文章

  1. 2022-2028全球及中国数字集成电路行业研究及十四五规划分析报告
  2. FRDM-KL43开发板驱动段式液晶SLCD的实现方法
  3. 计算机科学与技术对法律的影响,计算机科学与技术(2015)
  4. 开发时应该养成的好习惯
  5. 山东大学软件学院离散数学(2)
  6. 腾讯云域名解析教程(域名DNS解析到公网IP地址)
  7. 变电站通信网络和系统协议IEC61850介绍
  8. 20220604_MySQL_多表查询案例
  9. c语言通讯录链表结构体排序,写个通讯录 想要简单就全用的是结构体数组要求改成用链表的...专业的朋友看能不能最简洁的改一下...
  10. 算法之弗洛伊德(Floyd)算法