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
總結
以上是生活随笔為你收集整理的EF实体框架数据操作基类(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC学习中遇到的小问题和解决方案
- 下一篇: TOJ---2621--全排列