今天和大家一起学习一下当前流行的MVC5+EF+AutoFac+AutoMapper轻型架构,先上一张框架图
一、项目基本框架搭建
写程序的顺序是Model-DAL-BLL-UI,Model层就是表实体,我们略过,下面上DAL层代码
using Model; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace DAL { public class BaseDal<T> where T : class, new() { public DataModel _currentDbContext = DbContextFactory.GetDbContext(); public T Add(T item) { return _currentDbContext.Set<T>().Add(item); } public int Count(Expression<Func<T, bool>> predicate) { //set<t>针对对上下文和基础存储中给定类型的实体的访问返回一个 DbSet<TEntity> 实例。 return _currentDbContext.Set<T>().Count(predicate);//返回指定序列中满足条件的元素数量。 } public bool Update(T entity) { //Attach将实体以“未更改”的状态放置到上下文中,就好像从数据库读取了该实体一样。 _currentDbContext.Set<T>().Attach(entity); _currentDbContext.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified; return _currentDbContext.SaveChanges() > 0; } public bool Delete(T entity) { _currentDbContext.Set<T>().Attach(entity); _currentDbContext.Entry<T>(entity).State = System.Data.Entity.EntityState.Deleted; return _currentDbContext.SaveChanges() > 0; } public bool Exist(Expression<Func<T, bool>> anyLambda) { return _currentDbContext.Set<T>().Any(anyLambda); } public T Find(Expression<Func<T, bool>> whereLambda) { T entity = _currentDbContext.Set<T>().FirstOrDefault(); return entity; } public IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc) { var _list = _currentDbContext.Set<T>().Where<T>(whereLamdba); _list = OrderBy(_list, orderName, isAsc); return _list; } /// <summary> /// 排序 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="source">原IQueryable</param> /// <param name="propertyName">排序属性名</param> /// <param name="isAsc">是否正序</param> /// <returns>排序后的IQueryable<T></returns> private IQueryable<T> OrderBy(IQueryable<T> source, string propertyName, bool isAsc) { if (source == null) throw new ArgumentNullException("source", "不能为空"); if (string.IsNullOrEmpty(propertyName)) return source; var _parameter = Expression.Parameter(source.ElementType); var _property = Expression.Property(_parameter, propertyName); if (_property == null) throw new ArgumentNullException("propertyName", "属性不存在"); var _lambda = Expression.Lambda(_property, _parameter); var _methodName = isAsc ? "OrderBy" : "OrderByDescending"; var _resultExpression = Expression.Call(typeof(Queryable), _methodName, new Type[] { source.ElementType, _property.Type }, source.Expression, Expression.Quote(_lambda)); return source.Provider.CreateQuery<T>(_resultExpression); } public IQueryable<T> FindPageList(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc) { var _list = _currentDbContext.Set<T>().Where<T>(whereLamdba); totalRecord = _list.Count(); //if (isAsc) _list = _list.OrderBy<T, S>(orderLamdba).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize); //else _list = _list.OrderByDescending<T, S>(orderLamdba).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize); _list = OrderBy(_list, orderName, isAsc).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize); return _list; } } }