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
EF实体框架数据操作基类(转)的更多相关文章
- BIM工程信息管理系统-EF实体框架数据操作基类
EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// & ...
- EF实体框架数据操作接口(转)
//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司 ...
- EF实体框架之CodeFirst一
对于SQL Server.MySql.Oracle等这些传统的数据库,基本都是关系型数据库,都是体现实体与实体之间的联系,在以前开发时,可能先根据需求设计数据库,然后在写Model和业务逻辑,对于Mo ...
- EF实体框架之CodeFirst四
在EF实体框架之CodeFirst二中也提到数据库里面一般包括表.列.约束.主外键.级联操作.实体关系(E-R图).存储过程.视图.锁.事务.数据库结构更新等.前面几篇博客把表.存储过程.视图这些算是 ...
- BaseDAL最牛数据层基类2
using System; using System.Data.Entity; using System.Linq; using System.Threading.Tasks; using Syste ...
- EF实体框架处理实体之间关联关系与EF延迟机制(下)
在数据库中,表与表之间可能存在多种联系,比如,一对多,多对多的关系.当我们使用逻辑外键在数据库建立两张表之间的关系的时候,我们使用EF实体框架 必然也会将这种关系映射到我们的实体关系中来.所以,在我们 ...
- 【MVC 1】MVC+EF实体框架—原理解析
导读:在之前,我们学过了三层框架,即:UI.BLL.DAL.我们将页面显示.逻辑处理和数据访问进行分层,避免了一层.两层的混乱.而后,我们又在经典三层的基础上,应用设计模式:外观.抽象工厂+反射,使得 ...
- 【EF 1】EF实体框架 原理+实例
一.知识回顾 到目前为止,自己学到的链接数据库操作已经经历了几个阶段,分别是:学生信息管理和(第一次)机房收费时的直接连接数据库操作表格,然后是机房个人重构中应用的操作实体,在其中还利用了一个很重要的 ...
- BaseDAL数据层基类1
/// <summary> /// EF数据库操作基类 /// </summary> /// <typeparam name="T"></ ...
随机推荐
- FFmpeg官方文档之————先进音频编码(AAC)
先进音频编码(AAC)的后继格式到MP3,和以MPEG-4部分3(ISO / IEC 14496-3)被定义.它通常用于MP4容器格式; 对于音乐,通常使用.m4a扩展名.第二最常见的用途是在MKV( ...
- SCOI2009粉刷匠
Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...
- PageObject小结
写之前想把这次的灵感记录下来: 之前看PO模式几次,始终不得法,感觉一片混乱,可就在一天早上,正在照着别人的代码写自己项目时突然脑海中想通了几个问题:1.为什么要封装页面.2.各个模块的作用以及为什么 ...
- Android 四大组件之四(ContentProvider)
ContentProvider调用关系: ContentProvider(数据提供者)是应用程序之间共享数据的一种接口机制,是一种更为高级的数据共享方法. ContentProvider可以指定需要共 ...
- Apache Commons Collections
http://commons.apache.org/proper/commons-collections/userguide.html 1. Utilities SetUtils Collection ...
- WPF中实现登陆窗口的“记住帐号”功能
1.在Login.xaml中添加资源: <XmlDataProvider x:Key="XmlDataProvider" Source="pack://applic ...
- cookie封装
//设置cookie function setCookie(name,value,days){ //如果不设置天数 , 默认为30天 days=days?days:30; va ...
- SPSS数据分析—二分类Logistic回归模型
对于分类变量,我们知道通常使用卡方检验,但卡方检验仅能分析因素的作用,无法继续分析其作用大小和方向,并且当因素水平过多时,单元格被划分的越来越细,频数有可能为0,导致结果不准确,最重要的是卡方检验不能 ...
- bean生命周期
一.Bean的定义Spring通常通过配置文件定义Bean.如:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:s ...
- ALV Tree demo(WBS元素分层显示)[引用别人的]
原文地址:http://www.xuebuyuan.com/1666753.html 按层次显示WBS编码及描述,附加节点双击展开事件和Item双击跳转CJ03功能. 因为本人懒,本例代码都是从标准的 ...