搭建基本框架
创建基接口:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CZBK.HeiMaOA.IDAL { public interface IBaseDal<T> where T : class,new() { IQueryable<T> LoadEntities(System.Linq.Expressions.Expression<Func<T, bool>> whereLambda); IQueryable<T> LoadPageEntities<s>(int pageIndex, int pageSize, out int totalCount, System.Linq.Expressions.Expression<Func<T, bool>> whereLambda, System.Linq.Expressions.Expression<Func<T, s>> orderbyLambda, bool isAsc); bool DeleteEntity(T entity); bool UpdateEntity(T entity); T AddEntity(T entity); } }
其他接口层继承基接口:
using CZBK.HeiMaOA.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CZBK.HeiMaOA.IDAL { /// <summary> /// 由于每一个接口中,都需要定义CURD,那么造成重复了。所以我们这里可以封装一下。 /// </summary> public partial interface IUserInfoDal : IBaseDal<UserInfo> { //定义自己特有的数据操作的方法。 } }
创建dal层相应类,引用idal model 继承实现iuserinfodal(鼠标放在你iuserinfodal上右键会自动创建实现代码)
拿到EF上下文(demx下的cs文件中)
dal中快速引用EF方法: 在dal新建一个空的数据模型,然后干掉,该引的就都引了
创建basedal(把刚才实现userinfo的代码转移到basedal)

using CZBK.HeiMaOA.Model; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CZBK.HeiMaOA.DAL { public class BaseDal<T>where T:class,new() { // OAEntities Db = new OAEntities(); DbContext Db = DBContextFactory.CreateDbContext();//完成EF上下文创建. /// <summary> /// 基本查询方法 /// </summary> /// <param name="whereLambda"></param> /// <returns></returns> public IQueryable<T> LoadEntities(System.Linq.Expressions.Expression<Func<T, bool>> whereLambda) { return Db.Set<T>().Where<T>(whereLambda); } /// <summary> /// 分页方法 /// </summary> /// <typeparam name="s">排序的约束</typeparam> /// <param name="pageIndex">当前页码</param> /// <param name="pageSize">每页显示记录数</param> /// <param name="totalCount">总条数</param> /// <param name="whereLambda">过滤条件</param> /// <param name="orderbyLambda">排序条件</param> /// <param name="isAsc">排序方式</param> /// <returns></returns> public IQueryable<T> LoadPageEntities<s>(int pageIndex, int pageSize, out int totalCount, System.Linq.Expressions.Expression<Func<T, bool>> whereLambda, System.Linq.Expressions.Expression<Func<T, s>> orderbyLambda, bool isAsc) { var temp = Db.Set<T>().Where<T>(whereLambda); totalCount = temp.Count(); if (isAsc)//如果成立表示升序 { temp = temp.OrderBy<T, s>(orderbyLambda).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize); } else { temp = temp.OrderByDescending<T, s>(orderbyLambda).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize); } return temp; } /// <summary> /// 删除数据 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool DeleteEntity(T entity) { Db.Entry<T>(entity).State = System.Data.EntityState.Deleted; // return Db.SaveChanges() > 0; return true; } /// <summary> /// 更新 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool UpdateEntity(T entity) { Db.Entry<T>(entity).State = System.Data.EntityState.Modified; // return Db.SaveChanges() > 0; return true; } /// <summary> /// 添加数据 /// </summary> /// <param name="entity"></param> /// <returns></returns> public T AddEntity(T entity) { Db.Set <T>().Add(entity); //Db.SaveChanges(); return entity; } } }
userinfodal 几层basedal 、Iuserinfodal 此处不用实现,basedal已经实现
using CZBK.HeiMaOA.IDAL; using CZBK.HeiMaOA.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CZBK.HeiMaOA.DAL { public partial class UserInfoDal:BaseDal<UserInfo>,IUserInfoDal { } }
在工厂层 添加DBSession 数据会话层,其实就是一个工厂类
添加引用 dal idal model

using CZBK.HeiMaOA.DAL; using CZBK.HeiMaOA.IDAL; using CZBK.HeiMaOA.Model; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CZBK.HeiMaOA.DALFactory { /// <summary> /// DBSession:数据会话层,赋责数据操作类实例的创建。然后业务层调用数据会话层,获取相应的数据操作类实例。所以说,DBSession(数据会话层)其实就是一个工厂类,完成了业务层与数据层的解耦. /// </summary> public partial class DBSession:IDBSession { //DbContext Db = new OAEntities(); public DbContext Db { get { return DBContextFactory.CreateDbContext(); }//完成EF上下文创建 } //private IUserInfoDal _UserInfoDal; //public IUserInfoDal UserInfoDal //{ // get { // if (_UserInfoDal == null) // { // //_UserInfoDal = new UserInfoDal();//这里不能直接new,因为DBSession与数据层耦合. // _UserInfoDal = DALAbstractFactory.CreateUserInfoDal();//通过抽象工厂将数据会话层与数据层解耦. // } // return _UserInfoDal; // } // set // { // _UserInfoDal = value; // } //} /// <summary> /// 保存数据。一个业务中有可能涉及到对多张表的操作,那么我们希望是将要操作的数据先追加到EF上下文件中,然后再统一的保存到数据库中。这样,就完成了链接一次数据库,完成了多次操作。提高数据操作的性能。 /// </summary> /// <returns></returns> public bool SaveChanges() { return Db.SaveChanges() > 0; } /// <summary> /// 执行SQL语句。insert ,delete update /// </summary> /// <param name="sql"></param> /// <param name="pars"></param> /// <returns></returns> public int ExecuteSql(string sql, params System.Data.SqlClient.SqlParameter[] pars) { return Db.Database.ExecuteSqlCommand(sql, pars); } public List<T> ExecuteQuery<T>(string sql, params System.Data.SqlClient.SqlParameter[] pars) { return Db.Database.SqlQuery<T>(sql, pars).ToList(); } } }
dalfactory层创建抽象工厂

using System.Configuration; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace CZBK.HeiMaOA.DALFactory { /// <summary> /// 抽象工厂:都是解决对象的创建问题。(抽象工厂是通过反射的方式创建类的实例.) /// </summary> public partial class DALAbstractFactory { //private static readonly string DalNameSpace = ConfigurationManager.AppSettings["DalNameSpace"];//获取命名空间. // private static readonly string DalAssembly = ConfigurationManager.AppSettings["DalAssembly"]; //public static IUserInfoDal CreateUserInfoDal() //{ // string fullClassName = DalNameSpace + ".UserInfoDal";//构建类的全名称. // return CreateInstance(fullClassName,DalAssembly) as IUserInfoDal; //} private static object CreateInstance(string fullClassName,string assemblyPath) { var assembly=Assembly.Load(assemblyPath);//加载程序集. return assembly.CreateInstance(fullClassName); } } }