今天我们主要讨论下数据层父类和业务层父类的使用。众所周知,数据层无非就是实现增删改查的方法。无论是哪个实体类,无非就是为了实现增删改查方法,所有我们在三层的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. 使用VisualVM监控远程服务器JVM

    VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用.JVM堆内存消耗.线程.类加载的实时监控,内存dump文件分析,垃圾回收运行情况的可视化分析等,对故障排查和性能调优很 ...

  2. css颜色大全-转载

    FFFFFF #DDDDDD #AAAAAA #888888 #666666 #444444 #000000 #FFB7DD #FF88C2 #FF44AA  #FF0088  #C10066  #A ...

  3. python类——黑板客老师课程学习

    1.基本语法 class class_name(base_class):  base_class是它继承的父类 class_var def methods(self,args): statements ...

  4. HTML 透明、阴影,圆角等知识点

     table两个属性:cellpadding:内容与单元格边框的距离,内部距离cellspacing:单元格之间的距离,外部距离    table合并边框线:  border-collapse: co ...

  5. Python UTF8 读取文件

    严禁伸手党:

  6. Bash Shell实用快捷键

    Ctrl-D 相当于Del键,即删除光标所在处的字符 Ctrl-E 相当于End键,即将光标移动到本行末尾 Ctrl-K 用于删除从光标处开始到结尾处的所有字符 Ctrl-L 清屏,相当于clear命 ...

  7. perl 入门的基础

    perldoc是在搜索手册中查找你要寻找的函数 例如(查找print函数):perldoc -tf print

  8. 编程:什么是REST

    REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 ...

  9. scala学习:apply方法

    摘抄两段话: 在明确了方法调用的接收者的情况下,若方法只有一个参数时,调用的时候就可以省略点及括号.如 " to ",实际完整调用是 ".to()".但 &qu ...

  10. Great StackOverflow questions

    1. diffenece between MVC and MVP http://stackoverflow.com/questions/2056/what-are-mvp-and-mvc-and-wh ...