三层框架 自动BaseDal
baseDal类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Linq.Dynamic; using System.Data.Entity.Infrastructure; namespace BookShopPlus2.EfDal { /// <summary> /// 封装增删改的类 /// </summary> public class BaseDal<T> where T:class { //实例化数据操作上下文 public BookShopPlus2Context DbContext = new BookShopPlus2Context(); //创建无参构造函数 public BaseDal() { //关闭四个功能 //关闭自动检查更新项 DbContext.Configuration.AutoDetectChangesEnabled = false; //关闭懒加载 DbContext.Configuration.LazyLoadingEnabled = false; //关闭动态代理 DbContext.Configuration.ProxyCreationEnabled = false; //关闭检查机制(非空验证) DbContext.Configuration.ValidateOnSaveEnabled = false; } #region 增删改 /// <summary> /// 添加 /// </summary> /// <param name="modle"></param> /// <returns></returns> public int Add(T modle) { try { DbContext.Set<T>().Attach(modle); //更改状态[添加] DbContext.Entry(modle).State = EntityState.Added; //SaveChanges返回受影响的行数,增删改查都要用到此代码 int rows = DbContext.SaveChanges(); return rows; } catch (Exception) { return -1; } finally { //移除对象池 DbContext.Entry(modle).State = EntityState.Detached; } } /// <summary> /// 修改 /// </summary> /// <param name="modle"></param> /// <returns></returns> public int Update(T modle) { try { DbContext.Set<T>().Attach(modle); //更改状态[添加] DbContext.Entry(modle).State = EntityState.Modified; //SaveChanges返回受影响的行数,增删改查都要用到此代码 int rows = DbContext.SaveChanges(); return rows; } catch (Exception) { return -1; } finally { //移除对象池 DbContext.Entry(modle).State = EntityState.Detached; } } /// <summary> /// 删除 /// </summary> /// <param name="modle"></param> /// <returns></returns> public int Dal(T modle) { try { DbContext.Set<T>().Attach(modle); //更改状态[添加] DbContext.Entry(modle).State = EntityState.Deleted; //SaveChanges返回受影响的行数,增删改查都要用到此代码 int rows = DbContext.SaveChanges(); return rows; } catch (Exception) { return -1; } } #endregion #region 查询 /// <summary> /// 条件查询 /// </summary> /// <param name="condition"></param> /// <param name="joinModel"></param> /// <returns></returns> public List<T> Select(string condition, params string[] joinModel) { List<T> list = null; //基础语句 //dbContext.Users.AsNoTracking() DbQuery<T> baseQuery = DbContext.Set<T>().AsNoTracking(); //数组可以循环 for (int i = 0; i < joinModel.Length; i++) { //dbContext.Users.AsNoTracking().Include("UserRole").include("UserStatus") baseQuery = baseQuery.Include(joinModel[i]); } //有条件,加上条件查询 if (!string.IsNullOrEmpty(condition)) { list = baseQuery.Where(condition).ToList(); } else { //没有条件直接查询 list = baseQuery.ToList(); } return list; } /// <summary> /// 查询单个对象 /// </summary> /// <param name="condition"></param> /// <returns></returns> public T SelectOne(string condition, params string[] joinModel) { T modle = null; DbQuery<T> baseQuery= DbContext.Set<T>().AsNoTracking(); foreach (string join in joinModel) { baseQuery = baseQuery.Include(join); } if (!string.IsNullOrEmpty(condition)) { modle = baseQuery.Where(condition).FirstOrDefault(); } else { //没有条件直接查询 modle = baseQuery.FirstOrDefault(); } return modle; } /// <summary> /// 翻页方法 /// </summary> /// <param name="totalCount">总条数</param> /// <param name="currentPage">当前页</param> /// <param name="pageSize">提取条数</param> /// <param name="orderName">排序列名</param> /// <param name="condition">条件</param> /// <param name="joinModels">导航属性</param>params 表示可填可不填 /// <returns></returns> public List<T> SelectByPage(out int totalCount, int currentPage, int pageSize, string orderName, string condition, params string[] joinModels) { //参数(out int 总条数,int 当前页,int 提取条数,string order排序列名,string 条件,string[]joinModels(导航属性-外键)) //dbContext.Books.AsNotracking(),Incluide(),Orderby(),where(b=> 1==1).Skip().Take().ToList(); DbQuery<T> baseQuery= DbContext.Set<T>().AsNoTracking(); foreach (string join in joinModels) { baseQuery = baseQuery.Include(join); } //拼接OrderBy IQueryable<T> orderQuery= baseQuery.OrderBy(orderName); //拼接where if (!string.IsNullOrEmpty(condition)) { orderQuery = orderQuery.Where(condition); //总条数 totalCount = orderQuery.Count(); } else { totalCount = orderQuery.Count(); } return orderQuery.Skip((currentPage - 1) * pageSize).Take(pageSize).ToList(); } #endregion } }