zoukankan      html  css  js  c++  java
  • EF结合三层:三层中数据层父类和业务层父类的使用

     

         今天我们主要讨论下数据层父类和业务层父类的使用。众所周知,数据层无非就是实现增删改查的方法。无论是哪个实体类,无非就是为了实现增删改查方法,所有我们在三层的DAL层封装了一个BaseDAL类,来做增删改查。在BLL层封装了一个BaseBLL类,来做增删改查。如果在Model层,通过ModelFirst的方式,又添加了新的实体(YYY),那么在DAL层只需要定义一个类YYYDAL,并让YYYDAL继承自BaseDAL即可 。同理,在BLL层, 只需要定义一个类YYYBLL,并让其继承自BaseBLL即可 。下面我们来完成这个描述。

        由于该文章的侧重点数据层父类和业务层父类的使用。所以我们就不再领着大家搭建三层结构。默认大家已经创建好的程序的架构。

       

        并且在edmx模型中我们已经创建了两个实体。这里我们使用CustomerTicket(由于最近在讲解影院售票系统)

     

    步骤一:先在DAL层创建一个CustomerDAL类,并且书写对应的增删改查以及分页的方法。

     1 public class CustomerDAL
     2     {
     3        //数据库上下文对象
     4        YYMMVCEntities db = new YYMMVCEntities();
     5        /// <summary>
     6        /// 新增操作
     7        /// </summary>
     8        public int Add(Customer customer)
     9        {
    10            db.Customers.AddObject(customer);
    11            //保存成功后会将自增的ID设置成customer的主键属性
    12           return db.SaveChanges();
    13        }       
    14        //删除
    15        public int DeleteBy(int cid)
    16        {
    17            Customer customer=new Customer(){CID = cid};
    18            db.Customers.Attach(customer);
    19            db.Customers.DeleteObject(customer);
    20            return db.SaveChanges();
    21        }
    22        //根据条件删除
    23        public int DeleteExpression(System.Linq.Expressions.Expression<Func<Customer,bool>> deleWhere)
    24        {
    25            List<Customer> customers=db.Customers.Where(deleWhere).ToList();
    26           customers.ForEach(m=>db.Customers.DeleteObject(m));
    27            return db.SaveChanges();
    28        }
    29 
    30        //修改方法
    31        public  int Modify(Customer customer)
    32        {
    33            db.Attach(customer);
    34            db.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified);
    35            return db.SaveChanges();
    36        }
    37        //查询
    38        publicList<Customer> GetListBy(System.Linq.Expressions.Expression<Func<Customer,bool>> seleWhere)
    39        {
    40            return db.Customers.Where(seleWhere).ToList();
    41        }
    42        //查询和排序
    43        public List<Customer> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<Customer,bool>> seleWhere,System.Linq.Expressions.Expression<Func<Customer,Tkey>> orderWhere)
    44        {
    45            return db.Customers.Where(seleWhere).OrderBy(orderWhere).ToList();
    46        }
    47        //分页查询
    48        public List<Customer> GetListPaged(int pageIndex,int pageSize,System.Linq.Expressions.Expression<Func<Customer,bool>> orderbyWhere)
    49        {
    50            return db.Customers.OrderBy(orderbyWhere).Skip((pageIndex - 1)*pageSize).Take(pageSize).ToList();
    51        } 
    52    }

    第二步:书写BaseDAL类

        然后我们在DAL层新建一个BaseDAL类,类中内容是通过CustomerDAL修改而来的,将出现Customer的地方替换成了T,出现Customers的地方改成了CreateObjectSet<T>()

    ,修正后的类如下

     

     1 public class BaseDAL<T> where T:class,new()
     2     {
     3         //数据库上下文对象
     4         YYMMVCEntities db = new YYMMVCEntities();
     5         /// <summary>
     6         /// 新增操作
     7         /// </summary>
     8         public int Add(T customer)
     9         {
    10             //必须限定T的类型,只能为引用类型
    11             db.CreateObjectSet<T>().AddObject(customer);
    12             //保存成功后会将自增的ID设置成customer的主键属性
    13             return db.SaveChanges();
    14         }
    15 
    16         //删除
    17         public int DeleteBy(T model)
    18         {
    19             
    20             db.CreateObjectSet<T>().Attach(model);
    21             db.CreateObjectSet<T>().DeleteObject(model);
    22             return db.SaveChanges();
    23         }
    24         //根据条件删除
    25         public int DeleteExpression(System.Linq.Expressions.Expression<Func<T, bool>> deleWhere)
    26         {
    27             List<T> customers = db.CreateObjectSet<T>().Where(deleWhere).ToList();
    28             customers.ForEach(m => db.CreateObjectSet<T>().DeleteObject(m));
    29             return db.SaveChanges();
    30         }
    31 
    32         //修改方法
    33         public int Modify(T customer)
    34         {
    35             db.CreateObjectSet<T>().Attach(customer);
    36             db.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified);
    37             return db.SaveChanges();
    38         }
    39 
    40         //查询
    41         public List<T> GetListBy(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere)
    42         {
    43             return db.CreateObjectSet<T>().Where(seleWhere).ToList();
    44         }
    45         //查询和排序
    46         public List<T> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere, System.Linq.Expressions.Expression<Func<T, Tkey>> orderWhere)
    47         {
    48             return db.CreateObjectSet<T>().Where(seleWhere).OrderBy(orderWhere).ToList();
    49         }
    50         //分页查询
    51         public List<T> GetListPaged(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<T, bool>> orderbyWhere)
    52         {
    53             return db.CreateObjectSet<T>().OrderBy(orderbyWhere).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
    54 
    55         } 
    56    }

          其中public class BaseDAL<T> where T:class,new()中where T:class代表T的类型只能是引用类型,new()代表T类型必须有无参的构造。

     到这里我们已经完成了对DAL层父类的书写。

    第三步:书写BaseBLL类

         接下来,我们就可以书写BaseBLL类了,当然,抽取BaseBLL类的方式和抽取BaseDAL的方式基本一致,在这里就直接写出BaseBLL的类的代码结构了。

     1 public class BaseBLL<T> where T:class,new ()
     2     {
     3        protected  BaseDAL<T> dal = new BaseDAL<T>();
     4         /// <summary>
     5         /// 新增操作
     6         /// </summary>
     7         public int Add(T customer)
     8         {
     9             return dal.Add(customer);
    10         }
    11 
    12         //删除
    13         public int DeleteBy(T cid)
    14         {
    15             return dal.DeleteBy(cid);
    16         }
    17         //根据条件删除
    18         public int DeleteExpression(System.Linq.Expressions.Expression<Func<T, bool>> deleWhere)
    19         {
    20             return dal.DeleteExpression(deleWhere);
    21         }
    22 
    23         //修改方法
    24         public int Modify(T customer)
    25         {
    26             return dal.Modify(customer);
    27         }
    28 
    29         //查询
    30         public List<T> GetListBy(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere)
    31         {
    32             return dal.GetListBy(seleWhere);
    33         }
    34         //查询和排序
    35         public List<T> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere, System.Linq.Expressions.Expression<Func<T, Tkey>> orderWhere)
    36         {
    37             return dal.GetListBy(seleWhere, orderWhere);
    38         }
    39         //分页查询
    40         public List<T> GetListPaged(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<T, bool>> orderbyWhere)
    41         {
    42             return dal.GetListPaged(pageIndex, pageSize, orderbyWhere);
    43 
    44         } 
    45     }

     其实,我们发现一个问题,就先现在我们的BLL层就是起到了一个数据隔离的作用。

           然后我们就可以在对应的DAL层和BLL层创建对应的子类来继承自各自的父类。接下来我们通过ModelFirst的方式修改edmx模型,在其中添加一个新的实体Book,并且建立Customer和Book之间的关系(1对多)。如下图:

     

    步骤四:在DAL层添加BookDAL类,并且继承自BaseDAL;在BLL层添加BookBLL类,并且继承自BaseBLL类。

    在页面的Load事件中书写如下代码:

    1      if (!IsPostBack)
    2             {
    3                 BookBLL bll=new BookBLL();
    4                 List<Book> list=bll.GetListBy(m => m.ID > 0);
    5                 Repeater1.DataSource = list;
    6                 Repeater1.DataBind();
    7             }

     就可以验证子类对象是否成功继承父类的方法。

     

    好的,我们今天的探讨到此结束!

     

  • 相关阅读:
    sudo 做不到的事
    Oracle 用户操作表权限
    CentOS7.2 使用Shell安装Oracle12c
    package-cleanup
    glibc-commons 依赖解析 版本错误,xxx is duplicate yyy
    Centos7.2 编译安装方式搭建 phpMyAdmin
    Jenkins 环境搭建
    awk 使用案例
    Linux文件系统
    用python写一个计算器
  • 原文地址:https://www.cnblogs.com/weilengdeyu/p/3588472.html
Copyright © 2011-2022 走看看