EF实体框架数据操作基类(转)
//----------------------------------------------------------------
// Copyright (C) 2013 河南祿恒軟件科技有限公司
//
// 功能描述:實(shí)體框架數(shù)據(jù)倉儲(chǔ)的操作接口,包含增刪改查接口
//
//----------------------------------------------------------------
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>
??? ///???? 實(shí)體框架數(shù)據(jù)倉儲(chǔ)的基類
??? /// </summary>
??? /// <typeparam name="TContext">提供用于查詢和使用對(duì)象形式的實(shí)體數(shù)據(jù)的功能的實(shí)體上下文</typeparam>
??? /// <typeparam name="T">表示用于執(zhí)行創(chuàng)建、讀取、更新和刪除操作的類型化實(shí)體集</typeparam>
??? public abstract class EntityRepositoryBase<TContext, T> : IRepository<T>
??????? where TContext : DbContext
??????? where T : class, new()
??? {
??????? /// <summary>
??????? ///???? 表示用于執(zhí)行創(chuàng)建、讀取、更新和刪除操作的類型化實(shí)體集
??????? /// </summary>
??????? private DbSet<T> _dbSet;
??????? /// <summary>
??????? ///
??????? /// </summary>
??????? protected EntityRepositoryBase()
??????? {
??????????? IsOwnContext = false;
??????? }
??????? /// <summary>
??????? ///???? 提供用于查詢和使用對(duì)象形式的實(shí)體數(shù)據(jù)的功能的實(shí)體上下文
??????? /// </summary>
??????? protected virtual TContext Context { get; set; }
??????? /// <summary>
??????? ///???? 表示用于執(zhí)行創(chuàng)建、讀取、更新和刪除操作的類型化實(shí)體集
??????? /// </summary>
??????? protected virtual DbSet<T> Set
??????? {
??????????? get { return _dbSet ?? (_dbSet = Context.Set<T>()); }
??????????? set { _dbSet = value; }
??????? }
??????? /// <summary>
??????? ///???? 是否擁有上下文
??????? /// </summary>
??????? protected bool IsOwnContext { get; set; }
??????? /// <summary>
??????? ///???? 返回一個(gè) System.Linq.IQueryable
??????? /// </summary>
??????? /// <returns>一個(gè) System.Linq.IQueryable,包含滿足由 predicate 指定的條件的元素</returns>
??????? public virtual IQueryable<T> All()
??????? {
??????????? return Set.Where(p => true);
??????? }
??????? /// <summary>
??????? ///???? 返回一個(gè) System.Linq.IQueryable,包含滿足由 predicate 指定的條件的元素
??????? /// </summary>
??????? /// <param name="predicate">用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)</param>
??????? /// <returns>一個(gè) System.Linq.IQueryable,包含滿足由 predicate 指定的條件的元素</returns>
??????? public virtual IQueryable<T> Where(Expression<Func<T, bool>> predicate)
??????? {
??????????? var query = Set.Where(predicate);
??????????? return query;
??????? }
??????? /// <summary>
??????? ///???? 返回一個(gè) System.Linq.IQueryable<T>,包含滿足由 predicate 和 分頁參數(shù) 指定的條件的元素,并根據(jù)鍵對(duì)其元素排序</T>
??????? /// </summary>
??????? /// <param name="predicate">用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)</param>
??????? /// <param name="pageSize">頁大小</param>
??????? /// <param name="pageIndex">頁碼</param>
??????? /// <param name="orderingSelector">用于從元素中提取鍵的函數(shù)</param>
??????? /// <param name="orderBy">排序類型</param>
??????? /// <param name="recCount">總數(shù)量</param>
??????? /// <returns>一個(gè) System.Linq.IQueryable<T/>,包含滿足由 predicate 和 分頁參數(shù) 指定的條件的元素,并根據(jù)鍵對(duì)其元素排序</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>
??????? ///???? 返回一個(gè) System.Linq.IQueryable<T/>,包含滿足由 predicate 指定的條件的元素,并根據(jù)鍵對(duì)其元素排序
??????? /// </summary>
??????? /// <param name="predicate">用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)</param>
??????? /// <param name="orderingSelector">用于從元素中提取鍵的函數(shù)</param>
??????? /// <param name="orderBy">排序</param>
??????? /// <returns>一個(gè) System.Linq.IQueryable<T/>,包含滿足由 predicate 指定的條件的元素,并根據(jù)鍵對(duì)其元素排序</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查詢數(shù)據(jù)結(jié)果
??????? /// </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>
??????? ///???? 返回序列的唯一元素;如果該序列并非恰好包含一個(gè)元素,則會(huì)引發(fā)異常。
??????? /// </summary>
??????? /// <param name="predicate">用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)</param>
??????? /// <returns>單個(gè)元素</returns>
??????? public virtual T Single(Expression<Func<T, bool>> predicate)
??????? {
??????????? return Set.Single(predicate);
??????? }
??????? /// <summary>
??????? ///???? 返回序列的唯一元素;如果該序列并非恰好包含一個(gè)元素,則會(huì)引發(fā)異常。
??????? /// </summary>
??????? /// <param name="predicate">用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)</param>
??????? /// <param name="orderingSelector">用于從元素中提取鍵的函數(shù)</param>
??????? /// <param name="orderBy">排序</param>
??????? /// <returns>單個(gè)元素</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>
??????? ///???? 返回序列中滿足指定條件的唯一元素;如果序列中不包含任何元素,則返回默認(rèn)值
??????? /// </summary>
??????? /// <param name="predicate">用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)</param>
??????? /// <returns>唯一元素</returns>
??????? public virtual T FirstOrDefault(Expression<Func<T, bool>> predicate)
??????? {
??????????? return Set.FirstOrDefault(predicate);
??????? }
??????? /// <summary>
??????? ///???? 返回序列中滿足指定條件的唯一元素;如果序列中不包含任何元素,則返回默認(rèn)值
??????? /// </summary>
??????? /// <param name="predicate">用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)</param>
??????? /// <param name="orderingSelector">用于從元素中提取鍵的函數(shù)</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>
??????? ///???? 返回指定序列中滿足條件的元素?cái)?shù)量
??????? /// </summary>
??????? /// <param name="predicate">用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)</param>
??????? /// <returns>元素?cái)?shù)量</returns>
??????? public virtual int Count(Expression<Func<T, bool>> predicate)
??????? {
??????????? return Set.Count(predicate);
??????? }
??????? /// <summary>
??????? ///???? 將對(duì)象添加到當(dāng)前實(shí)體集中的對(duì)象上下文;如果 IsOwnContex == true,將對(duì)象保存到數(shù)據(jù)源
??????? /// </summary>
??????? /// <param name="entity">實(shí)體對(duì)象</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>
??????? ///???? 將對(duì)象標(biāo)記為待刪除;如果 IsOwnContex == true,將對(duì)象保存到數(shù)據(jù)源
??????? /// </summary>
??????? /// <param name="entity">實(shí)體對(duì)象</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 指定的條件的元素對(duì)象標(biāo)記為待刪除;
??????? /// </summary>
??????? /// <param name="predicate">用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)</param>
??????? /// <returns>操作是否成功</returns>
??????? public virtual bool Delete(Expression<Func<T, bool>> predicate)
??????? {
??????????? return Set.Where(predicate).Delete() > 0;
??????? }
??????? /// <summary>
??????? ///???? 將滿足 predicate 指定的條件的元素對(duì)象更新為滿足 updatePredicate 條件的屬性;
??????? /// </summary>
??????? /// <param name="predicate">用于測(cè)試每個(gè)元素是否滿足條件的函數(shù)</param>
??????? /// <param name="updatePredicate">用于構(gòu)建對(duì)象的函數(shù)</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>
??????? ///???? 臨時(shí)把實(shí)休對(duì)象保存在管理對(duì)象中
??????? /// </summary>
??????? /// <param name="entity"></param>
??????? public virtual void AddEntity(T entity)
??????? {
??????????? Set.Add(entity);
??????? }
????? ?
??????? /// <summary>
??????? ///???? 將所有更新保存到數(shù)據(jù)源并重置對(duì)象上下文中的更改跟蹤。
??????? /// </summary>
??????? /// <returns>
??????? ///???? 在調(diào)用 System.Data.Objects.ObjectContext.SaveChanges() 時(shí)處于
??????? ///???? System.Data.EntityState.Added、System.Data.EntityState.Modified或 System.Data.EntityState.Deleted 狀態(tài)的對(duì)象數(shù)。
??????? /// </returns>
??????? public int SaveChanges()
??????? {
??????????? return Context.SaveChanges();
??????? }
??? }
}
?
轉(zhuǎn)自:http://www.cnblogs.com/henanluheng/p/3785596.html
轉(zhuǎn)載于:https://www.cnblogs.com/gdutzhulm/p/3785710.html
總結(jié)
以上是生活随笔為你收集整理的EF实体框架数据操作基类(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC学习中遇到的小问题和解决方案
- 下一篇: TOJ---2621--全排列