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

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

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

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

 public class CustomerDAL
{
//数据库上下文对象
YYMMVCEntities db = new YYMMVCEntities();
/// <summary>
/// 新增操作
/// </summary>
public int Add(Customer customer)
{
db.Customers.AddObject(customer);
//保存成功后会将自增的ID设置成customer的主键属性
return db.SaveChanges();
}
//删除
public int DeleteBy(int cid)
{
Customer customer=new Customer(){CID = cid};
db.Customers.Attach(customer);
db.Customers.DeleteObject(customer);
return db.SaveChanges();
}
//根据条件删除
public int DeleteExpression(System.Linq.Expressions.Expression<Func<Customer,bool>> deleWhere)
{
List<Customer> customers=db.Customers.Where(deleWhere).ToList();
customers.ForEach(m=>db.Customers.DeleteObject(m));
return db.SaveChanges();
} //修改方法
public int Modify(Customer customer)
{
db.Attach(customer);
db.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified);
return db.SaveChanges();
}
//查询
publicList<Customer> GetListBy(System.Linq.Expressions.Expression<Func<Customer,bool>> seleWhere)
{
return db.Customers.Where(seleWhere).ToList();
}
//查询和排序
public List<Customer> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<Customer,bool>> seleWhere,System.Linq.Expressions.Expression<Func<Customer,Tkey>> orderWhere)
{
return db.Customers.Where(seleWhere).OrderBy(orderWhere).ToList();
}
//分页查询
public List<Customer> GetListPaged(int pageIndex,int pageSize,System.Linq.Expressions.Expression<Func<Customer,bool>> orderbyWhere)
{
return db.Customers.OrderBy(orderbyWhere).Skip((pageIndex - )*pageSize).Take(pageSize).ToList();
}
   }

第二步:书写BaseDAL类

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

,修正后的类如下

 public class BaseDAL<T> where T:class,new()
{
//数据库上下文对象
YYMMVCEntities db = new YYMMVCEntities();
/// <summary>
/// 新增操作
/// </summary>
public int Add(T customer)
{
//必须限定T的类型,只能为引用类型
db.CreateObjectSet<T>().AddObject(customer);
//保存成功后会将自增的ID设置成customer的主键属性
return db.SaveChanges();
} //删除
public int DeleteBy(T model)
{ db.CreateObjectSet<T>().Attach(model);
db.CreateObjectSet<T>().DeleteObject(model);
return db.SaveChanges();
}
//根据条件删除
public int DeleteExpression(System.Linq.Expressions.Expression<Func<T, bool>> deleWhere)
{
List<T> customers = db.CreateObjectSet<T>().Where(deleWhere).ToList();
customers.ForEach(m => db.CreateObjectSet<T>().DeleteObject(m));
return db.SaveChanges();
} //修改方法
public int Modify(T customer)
{
db.CreateObjectSet<T>().Attach(customer);
db.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified);
return db.SaveChanges();
} //查询
public List<T> GetListBy(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere)
{
return db.CreateObjectSet<T>().Where(seleWhere).ToList();
}
//查询和排序
public List<T> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere, System.Linq.Expressions.Expression<Func<T, Tkey>> orderWhere)
{
return db.CreateObjectSet<T>().Where(seleWhere).OrderBy(orderWhere).ToList();
}
//分页查询
public List<T> GetListPaged(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<T, bool>> orderbyWhere)
{
return db.CreateObjectSet<T>().OrderBy(orderbyWhere).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList(); }
   }

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

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

第三步:书写BaseBLL类

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

 public class BaseBLL<T> where T:class,new ()
{
protected BaseDAL<T> dal = new BaseDAL<T>();
/// <summary>
/// 新增操作
/// </summary>
public int Add(T customer)
{
return dal.Add(customer);
} //删除
public int DeleteBy(T cid)
{
return dal.DeleteBy(cid);
}
//根据条件删除
public int DeleteExpression(System.Linq.Expressions.Expression<Func<T, bool>> deleWhere)
{
return dal.DeleteExpression(deleWhere);
} //修改方法
public int Modify(T customer)
{
return dal.Modify(customer);
} //查询
public List<T> GetListBy(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere)
{
return dal.GetListBy(seleWhere);
}
//查询和排序
public List<T> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere, System.Linq.Expressions.Expression<Func<T, Tkey>> orderWhere)
{
return dal.GetListBy(seleWhere, orderWhere);
}
//分页查询
public List<T> GetListPaged(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<T, bool>> orderbyWhere)
{
return dal.GetListPaged(pageIndex, pageSize, orderbyWhere); }
}

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

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

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

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

      if (!IsPostBack)
{
BookBLL bll=new BookBLL();
List<Book> list=bll.GetListBy(m => m.ID > );
Repeater1.DataSource = list;
Repeater1.DataBind();
}

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

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

EF结合三层:三层中数据层父类和业务层父类的使用的更多相关文章

  1. CGI servlet Applet Scriptlet Scriptlet JSP data layer(数据层),business layer(业务层), presentation layer(表现层)

    https://en.wikipedia.org/wiki/Common_Gateway_Interface In computing, Common Gateway Interface (CGI) ...

  2. view是视图层+action是控制层+service是业务层+dao是数据访问层。

  3. servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因

    package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...

  4. 为什么三层架构中业务层(service)、持久层(dao)需要使用一个接口?

    为什么三层架构中业务层(service).持久层(dao)需要使用一个接口? 如果没有接口那么我们在控制层使用业务层或业务层使用持久层时,必须要学习每个方法,若哪一天后者的方法名改变了则直接影响到前面 ...

  5. 23、ASP.NET MVC入门到精通——业务层和数据层父类及接口-T4模板

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在上一篇中,我们已经把项目的基本框架搭起来了,这一篇我们就来实现业务层和数据层的父接口及父类. 1.我们先来定义一个业务层父接口IBaseB ...

  6. 三层架构中bll层把datatable转换为实体model的理解

    看了很多人的项目,很多都是用到三层架构,其中BLL层中有一种将DataTable转换为实体的方法.一直没有明白为啥要这样做,今天特意去搜索了一下,如果没有答案我是准备提问,寻求解答了.还好找到一个相关 ...

  7. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布

    在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...

  8. 谈谈三层架构中Model的作用

    Model又叫实体类,这个东西,大家可能觉得不好分层.包括我以前在内,是这样理解的:UI<-->Model<-->BLL<-->Model<-->DAL ...

  9. 【转】.NET 三层架构 中 DAL+IDAL+Model+BLL+Web

    其实三层架构是一个程序最基本的 在.Net开发中通常是多层开发 比如说 BLL 就是business Logic laywer(业务逻辑层) 他只负责向数据提供者也就是DAL调用数据 然后传递给 客户 ...

随机推荐

  1. VC++ 控制外部程序,向外部程序发送一个消息的方法

    这里需要考虑两部分的内容: 发送端: 查找对应的窗体,找到CWnd的值 向窗体发送消息 举例: CWnd* wnd = FindWindow(NULL, _T("选择题做题过程中" ...

  2. A configuration with this name already exists

    进入eclipse的workspace下的目录workspace\.metadata\.plugins\org.eclipse.debug.core\.launches,如实际目录为: D:\work ...

  3. xUtils框架的使用

    xUtils简介 xUtils 包含了很多实用的android工具,xUtils 源于Afinal框架,对Afinal进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持,拥有 ...

  4. Selenium2+python自动化16-alert\confirm\prompt

    前言 不是所有的弹出框都叫alert,在使用alert方法前,先要识别出到底是不是alert.先认清楚alert长什么样子,下次碰到了,就可以用对应方法解决. alert\confirm\prompt ...

  5. JQuery Checkbox的change事件

    JQuery   Checkbox的change事件  参考 http://blog.csdn.net/hbhgjiangkun/article/details/8126981   $(functio ...

  6. kubernetes Ubuntu部署

    规划节点 安装 ubuntu 14.04 LTS 准备password-less SSH登录 建立 ssh-key 证书,切换到root 账户,使用命令 ssh-keygen -t rsa Gener ...

  7. js原型

    1.js基本类型和对象类型 js的简单类型包括数字(其中NaN为数字类型).字符串(类似'A'为字符,js没字符类型).布尔值.null值和undefined值.其他所有的值都是对象.数字.字符串和布 ...

  8. PHP创建缩略图造成图片质量低下的完美解决方法

    近期弄个论坛,在首页要有个排名,显示评论最多的前十位用户的列表,列表有个略图是用户最新上传的作品,如果使用原来的图,图片过大,首页加载过慢,因此要使用略图 以上来使用imagecopyresized这 ...

  9. 基本套接字编程(3) -- select篇

    1. I/O复用 我们学习了I/o复用的基本知识,了解到目前支持I/O复用的系统调用有select.pselect.poll.epoll.而epoll技术以其独特的优势被越来越多的应用到各大企业服务器 ...

  10. Floyd 求最短路(poj 1161)

    Floyd-Warshall算法介绍: Floyd-Warshall算法的原理是动态规划. 设为从到的只以集合中的节点为中间节点的最短路径的长度. 若最短路径经过点k,则: 若最短路径不经过点k,则. ...