EF实体框架数据操作基类(转)

//----------------------------------------------------------------
// Copyright (C) 2013 河南禄恒软件科技有限公司
//
// 功能描述:实体框架数据仓储的操作接口,包含增删改查接口
//
//----------------------------------------------------------------
using System;
using System.Data.Entity.Infrastructure;
using System.Data.Objects;
using System.Linq;
using System.Linq.Expressions;
using System.Data.Entity;
using EntityFramework.Extensions;

namespace Qmvc.DataAccess.EntityRepository
{
    /// <summary>
    ///     实体框架数据仓储的基类
    /// </summary>
    /// <typeparam name="TContext">提供用于查询和使用对象形式的实体数据的功能的实体上下文</typeparam>
    /// <typeparam name="T">表示用于执行创建、读取、更新和删除操作的类型化实体集</typeparam>
    public abstract class EntityRepositoryBase<TContext, T> : IRepository<T>
        where TContext : DbContext
        where T : class, new()
    {
        /// <summary>
        ///     表示用于执行创建、读取、更新和删除操作的类型化实体集
        /// </summary>
        private DbSet<T> _dbSet;

        /// <summary>
        ///
        /// </summary>
        protected EntityRepositoryBase()
        {
            IsOwnContext = false;
        }

        /// <summary>
        ///     提供用于查询和使用对象形式的实体数据的功能的实体上下文
        /// </summary>
        protected virtual TContext Context { get; set; }

        /// <summary>
        ///     表示用于执行创建、读取、更新和删除操作的类型化实体集
        /// </summary>
        protected virtual DbSet<T> Set
        {
            get { return _dbSet ?? (_dbSet = Context.Set<T>()); }
            set { _dbSet = value; }
        }

        /// <summary>
        ///     是否拥有上下文
        /// </summary>
        protected bool IsOwnContext { get; set; }

        /// <summary>
        ///     返回一个 System.Linq.IQueryable
        /// </summary>
        /// <returns>一个 System.Linq.IQueryable,包含满足由 predicate 指定的条件的元素</returns>
        public virtual IQueryable<T> All()
        {
            return Set.Where(p => true);
        }

        /// <summary>
        ///     返回一个 System.Linq.IQueryable,包含满足由 predicate 指定的条件的元素
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <returns>一个 System.Linq.IQueryable,包含满足由 predicate 指定的条件的元素</returns>
        public virtual IQueryable<T> Where(Expression<Func<T, bool>> predicate)
        {
            var query = Set.Where(predicate);
            return query;
        }

        /// <summary>
        ///     返回一个 System.Linq.IQueryable<T>,包含满足由 predicate 和 分页参数 指定的条件的元素,并根据键对其元素排序</T>
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <param name="pageSize">页大小</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderingSelector">用于从元素中提取键的函数</param>
        /// <param name="orderBy">排序类型</param>
        /// <param name="recCount">总数量</param>
        /// <returns>一个 System.Linq.IQueryable<T/>,包含满足由 predicate 和 分页参数 指定的条件的元素,并根据键对其元素排序</returns>
        public virtual IQueryable<T> Where<TKey>(Expression<Func<T, bool>> predicate, int pageSize, int pageIndex,
            Expression<Func<T, TKey>> orderingSelector, OrderingOrders orderBy, out int recCount)
        {
            IQueryable<T> query = Set.Where(predicate);
            recCount = query.Count();
            query = orderBy == OrderingOrders.ASC
                ? query.OrderBy(orderingSelector).AsQueryable()
                : query.OrderByDescending(orderingSelector).AsQueryable();

            query = query.Skip((pageIndex - 1) * pageSize).Take(pageSize);

            return query;
        }

        /// <summary>
        ///     返回一个 System.Linq.IQueryable<T/>,包含满足由 predicate 指定的条件的元素,并根据键对其元素排序
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <param name="orderingSelector">用于从元素中提取键的函数</param>
        /// <param name="orderBy">排序</param>
        /// <returns>一个 System.Linq.IQueryable<T/>,包含满足由 predicate 指定的条件的元素,并根据键对其元素排序</returns>
        public virtual IQueryable<T> Where<TKey>(Expression<Func<T, bool>> predicate,
            Expression<Func<T, TKey>> orderingSelector, OrderingOrders orderBy)
        {
            IQueryable<T> query = Set.Where(predicate);
            query = orderBy == OrderingOrders.ASC
                ? query.OrderBy(orderingSelector).AsQueryable()
                : query.OrderByDescending(orderingSelector).AsQueryable();
            return query;
        }


        /// <summary>
        /// 通过SQL查询数据结果
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public virtual IQueryable<T> Where<TKey>(string sql, params object[] parameters)
        {
            IQueryable<T> query = Set.SqlQuery(sql, parameters).AsQueryable();
            return query;
        }


        /// <summary>
        ///     返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <returns>单个元素</returns>
        public virtual T Single(Expression<Func<T, bool>> predicate)
        {
            return Set.Single(predicate);
        }

        /// <summary>
        ///     返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <param name="orderingSelector">用于从元素中提取键的函数</param>
        /// <param name="orderBy">排序</param>
        /// <returns>单个元素</returns>
        public virtual T Single<TKey>(Expression<Func<T, bool>> predicate, Expression<Func<T, TKey>> orderingSelector,
            OrderingOrders orderBy)
        {
            IQueryable<T> query = Set.Where(predicate);
            query = orderBy == OrderingOrders.ASC
                ? query.OrderBy(orderingSelector).AsQueryable()
                : query.OrderByDescending(orderingSelector).AsQueryable();
            return query.Single();
        }

        /// <summary>
        ///     返回序列中满足指定条件的唯一元素;如果序列中不包含任何元素,则返回默认值
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <returns>唯一元素</returns>
        public virtual T FirstOrDefault(Expression<Func<T, bool>> predicate)
        {
            return Set.FirstOrDefault(predicate);
        }

        /// <summary>
        ///     返回序列中满足指定条件的唯一元素;如果序列中不包含任何元素,则返回默认值
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <param name="orderingSelector">用于从元素中提取键的函数</param>
        /// <param name="orderBy">排序</param>
        /// <returns>唯一元素</returns>
        public virtual T FirstOrDefault<TKey>(Expression<Func<T, bool>> predicate,
            Expression<Func<T, TKey>> orderingSelector, OrderingOrders orderBy)
        {
            IQueryable<T> query = Set.Where(predicate);
            query = orderBy == OrderingOrders.ASC
                ? query.OrderBy(orderingSelector).AsQueryable()
                : query.OrderByDescending(orderingSelector).AsQueryable();
            return query.FirstOrDefault();
        }

        /// <summary>
        ///     返回指定序列中满足条件的元素数量
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <returns>元素数量</returns>
        public virtual int Count(Expression<Func<T, bool>> predicate)
        {
            return Set.Count(predicate);
        }

        /// <summary>
        ///     将对象添加到当前实体集中的对象上下文;如果 IsOwnContex == true,将对象保存到数据源
        /// </summary>
        /// <param name="entity">实体对象</param>
        /// <returns>操作是否成功</returns>
        public virtual bool Add(T entity)
        {
            bool isSucceed;

            Set.Add(entity);

            if (IsOwnContext)
                isSucceed = Context.SaveChanges() > 0;
            else
                isSucceed = true;

            return isSucceed;
        }

        /// <summary>
        ///     将对象标记为待删除;如果 IsOwnContex == true,将对象保存到数据源
        /// </summary>
        /// <param name="entity">实体对象</param>
        /// <returns>操作是否成功</returns>
        public virtual bool Delete(T entity)
        {
            bool isSucceed;

            Set.Remove(entity);

            if (IsOwnContext)
                isSucceed = Context.SaveChanges() > 0;
            else
                isSucceed = true;

            return isSucceed;
        }

        /// <summary>
        ///     将满足 predicate 指定的条件的元素对象标记为待删除;
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <returns>操作是否成功</returns>
        public virtual bool Delete(Expression<Func<T, bool>> predicate)
        {
            return Set.Where(predicate).Delete() > 0;
        }

        /// <summary>
        ///     将满足 predicate 指定的条件的元素对象更新为满足 updatePredicate 条件的属性;
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <param name="updatePredicate">用于构建对象的函数</param>
        /// <returns>操作是否成功</returns>
        public virtual bool Update(Expression<Func<T, bool>> predicate, Expression<Func<T, T>> updatePredicate)
        {
            return Set.Update(predicate, updatePredicate) > 0;
        }


        /// <summary>
        ///
        /// </summary>
        public void Dispose()
        {
            if ((IsOwnContext) && (Context != null))
            {
                Context.Dispose();
            }
            GC.SuppressFinalize(this);
        }

        /// <summary>
        ///     临时把实休对象保存在管理对象中
        /// </summary>
        /// <param name="entity"></param>
        public virtual void AddEntity(T entity)
        {
            Set.Add(entity);
        }
       
        /// <summary>
        ///     将所有更新保存到数据源并重置对象上下文中的更改跟踪。
        /// </summary>
        /// <returns>
        ///     在调用 System.Data.Objects.ObjectContext.SaveChanges() 时处于
        ///     System.Data.EntityState.Added、System.Data.EntityState.Modified或 System.Data.EntityState.Deleted 状态的对象数。
        /// </returns>
        public int SaveChanges()
        {
            return Context.SaveChanges();
        }
    }
}

 

转自:http://www.cnblogs.com/henanluheng/p/3785596.html

转载于:https://www.cnblogs.com/gdutzhulm/p/3785710.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RabbitMQ】8、RabbitMQ之mandatory和immediate

1. 概述 mandatory和immediate是AMQP协议中basic.publish方法中的两个标识位&#xff0c;它们都有当消息传递过程中不可达目的地时将消息返回给生产者的功能。对于刚开始接触RabbitMQ的朋友特别容易被这两个参数搞混&#xff0c;这里博主整理了写资料&#xff0c;简单讲解下这两…

获取异常信息_如何在 ASP.NET Core 中实现全局异常拦截

异常是一种运行时错误&#xff0c;当异常没有得到适当的处理&#xff0c;很可能会导致你的程序意外终止&#xff0c;这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理&#xff0c;我会用一些 样例代码 和 截图 来说明这些概念。全局异常处理其实在 ASP.Net Core MV…

Hadoop学习笔记—15.HBase框架学习(基础知识篇)

Hadoop学习笔记—15.HBase框架学习&#xff08;基础知识篇&#xff09; HBase是Apache Hadoop的数据库&#xff0c;能够对大型数据提供随机、实时的读写访问。HBase的目标是存储并处理大型的数据。HBase是一个开源的&#xff0c;分布式的&#xff0c;多版本的&#xff0c;面向列…

室内地图 - (资料收集)

基于HTML5 Canvas绘制的支持手势缩放的室内地图 https://blog.csdn.net/licaomengRICE/article/details/50116781 室内地图制作流程 https://wenku.baidu.com/view/5dd7d6ba960590c69fc37604.html 使用JOSM绘制室内地图及路径&#xff08;一&#xff09; https://blog.csdn.…

C#异常处理机制初步

原地址&#xff1a;http://www.sudu.cn/info/html/edu/net/20071227/50446.html 一、c&#xff03;的异常处理所用到关键字 try 用于检查发生的异常&#xff0c;并帮助发送任何可能的异常。 catch 以控制权更大的方式处理错误&#xff0c;可以有多个catch子句。 finally 无论是…

scss常用(一)

charset "utf-8"; /* 页面中两边留下的空白 */ /* */ //间距 $generalMargin:2.86rem/2; $titleMargin:1.43rem/2; $moreBigMargin:4.29rem/2; $bigMargin:3.57rem/2; $smallMargin:2.14rem/2; $smallerMargin:1.5rem/2;/* *//* */ //尺寸 $bigFont:3.14rem/2; $m…

二维数组删除_「leetcode」数组:总结篇!(一文搞懂数组题目)

数组理论基础数组是非常基础的数据结构&#xff0c;在面试中&#xff0c;考察数组的题目一般在思维上都不难&#xff0c;主要是考察对代码的掌控能力也就是说&#xff0c;想法很简单&#xff0c;但实现起来 可能就不是那么回事了。首先要知道数组在内存中的存储方式&#xff0c…

TextView显示颜色高亮的问题

TextView textView (TextView) findViewById( R.id.tv );String text "<font color\"#d93b3a\">" "快过年了" "</font>" "<font color\"#666666\">" "哈哈哈哈" "</…

开源GIS解决方案,暨GeoServer+OpenLayer结合开发总结

http://linking123.github.io/2018/07/21/%E5%BC%80%E6%BA%90GIS%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E6%9A%A8GeoServer-OpenLayer%E7%BB%93%E5%90%88%E5%BC%80%E5%8F%91%E6%80%BB%E7%BB%93/ – 0.感叹 – 1.文档说明 – 2.文档内容 — 2.1 GeoServer - 地图服务 —…

TOJ---2621--全排列

这个方法 是超神教我的 --- 全排列的方法太多种了 感觉他这种写的 字典序法 是最简单的 最容易让人接受的 而且在时间复杂度和空间复杂度上 都可以让人接受 我待会将具体每步做法简要写一下...-> 我现在被一个 三角形给 深深烦死了 。。。。。。贴个代码 来 缓解下..... 1 …

Azure 和 Linux

Azure 正在不断集结各种集成的公有云服务&#xff0c;包括分析、虚拟机、数据库、移动、网络、存储和 Web&#xff0c;因此很适合用于托管解决方案。 Azure 提供可缩放的计算平台&#xff0c;允许即用即付&#xff0c;而无需投资购买本地硬件。 Azure 允许根据客户端所需的任何…

java获取classpath以外的路径

最近在使用以前写过的代码生成器&#xff08;从表名可生成所有的代码&#xff09;的时候&#xff0c;发现生成的文件都在classpath目录下&#xff0c;所有的文件都得自己拷到工程目录下&#xff0c;于是&#xff0c;想优化一下&#xff0c;取得classpath目录以外的路径&#xf…

月份第一天_4月份的第一天,全省迎来晴暖天气~

2019年4月1日早上好北方新农村准时准点播报~▼▼▼今天是2019年4月1日星期一辽宁的天气小孩的脸说变就变上周末突如其来的一场雪&#xff0c;让辽宁大部分地区“措手不及”已经开始回升的温度瞬间跌落到谷底。但不管怎样&#xff0c;随着节气的更迭&#xff0c;冷空气终究大势已…

Windows系统下搭建Git本地代码库

近由于工作需要&#xff0c;要把工作代码做一下版本管理。工作代码也不方便放到github上&#xff0c;也不想付费建私密库&#xff0c;公司也没几个人&#xff0c;所以就想着搭建一个本地Git版本库&#xff0c;来做版本管理。搭建过程如下。 系统环境&#xff1a;Dell OptiPlex…

mac 下终端 操作svn命令 以及出现证书错误的处理方法

首先&#xff0c;转载地址&#xff1a;http://hi.baidu.com/zhu410289616/item/eaaf160f60eb0dc62f4c6b0e 还有一个地址&#xff1a;http://www.cnblogs.com/heiniuhaha/archive/2011/11/11/2245594.html 解决证书出错&#xff0c;错误见下图&#xff1a; 解决方法&#xff1a;…

Linux shell multifile content replace with sed

#!/bin/bash# Linux shell multifile content replace with sed # 声明&#xff1a; # 本源代码主要是利用两份&#xff08;中、英文&#xff09;具有相同键值对的json数据&#xff0c;对html内的中文进行 # 自动化文本替换的代码。 # # …

jquery实时监听输入框值变化

在做web开发时候很多时候都需要即时监听输入框值的变化&#xff0c;以便作出即时动作去引导浏览者增强网站的用户体验感。而采用onchange时间又往往是在输入框失去焦点&#xff08;onblur&#xff09;时候触发&#xff0c;有时候并不能满足条件。 首先看一下dom中元素事件&…

文件过滤_jmeter(七)-BeanShell对数据过滤保存文件

在测试中有时需要对参数化数据进行过滤&#xff0c;实现保存到一个文件。如&#xff1a;某项目&#xff0c;从数据库查询到10万条用户数据&#xff0c;因为有的用户没有权限或者过期了&#xff0c;需要对这份数据筛选出来能正常使用的用户。如下使用beanshell实现此功能。原文件…

如何在mac系统下搭建git服务器

https://zhidao.baidu.com/question/1823748339128066228.html 第一步,下载gitblit http://gitblit.com/ 这里当然是选择linux/osx的版本。下载下来是一个.tar.gz的压缩文件&#xff0c;我下载时最新版本是gitblit-1.7.1.tar.gz 第二步&#xff0c;配置gitblit 创建目录&…

高级开发面试题

1.以前公司做过哪些项目&#xff1b; 2.这些项目都用到哪些技术&#xff1b; 3.redis里有哪些数据类型&#xff0c;对比memcache和redis&#xff1b; 4.目前平台的系统架构&#xff1b; 5.dubbo的server分了几个&#xff0c;怎么分的&#xff1b; 6.集群的负载策略&#xff1b;…