EF结合三层:三层中数据层父类和业务层父类的使用
今天我们主要讨论下数据层父类和业务层父类的使用。众所周知,数据层无非就是实现增删改查的方法。无论是哪个实体类,无非就是为了实现增删改查方法,所有我们在三层的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结合三层:三层中数据层父类和业务层父类的使用的更多相关文章
- 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) ...
- view是视图层+action是控制层+service是业务层+dao是数据访问层。
- servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因
package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...
- 为什么三层架构中业务层(service)、持久层(dao)需要使用一个接口?
为什么三层架构中业务层(service).持久层(dao)需要使用一个接口? 如果没有接口那么我们在控制层使用业务层或业务层使用持久层时,必须要学习每个方法,若哪一天后者的方法名改变了则直接影响到前面 ...
- 23、ASP.NET MVC入门到精通——业务层和数据层父类及接口-T4模板
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在上一篇中,我们已经把项目的基本框架搭起来了,这一篇我们就来实现业务层和数据层的父接口及父类. 1.我们先来定义一个业务层父接口IBaseB ...
- 三层架构中bll层把datatable转换为实体model的理解
看了很多人的项目,很多都是用到三层架构,其中BLL层中有一种将DataTable转换为实体的方法.一直没有明白为啥要这样做,今天特意去搜索了一下,如果没有答案我是准备提问,寻求解答了.还好找到一个相关 ...
- 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布
在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...
- 谈谈三层架构中Model的作用
Model又叫实体类,这个东西,大家可能觉得不好分层.包括我以前在内,是这样理解的:UI<-->Model<-->BLL<-->Model<-->DAL ...
- 【转】.NET 三层架构 中 DAL+IDAL+Model+BLL+Web
其实三层架构是一个程序最基本的 在.Net开发中通常是多层开发 比如说 BLL 就是business Logic laywer(业务逻辑层) 他只负责向数据提供者也就是DAL调用数据 然后传递给 客户 ...
随机推荐
- 一个PHP日历程序
<?php //<-------处理通过GET方法提交的变量;开始--------> if($HTTP_GET_VARS[year]=="") { ...
- jquery table 拼接集合
1html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...
- Android_ADB 常用 shell命令 和 sqlite3 简单增删改查
今天学习了一个ADB的常用命令.接下来简单使用几个常用ADB shell 命令. 首先我们得明白什么是adb.exe ADB -Android Debug Bridge, 是 Android sdk ...
- 学习笔记008之Task
栈 为后进先出 如何实现一个弹出窗体.
- IP验证
function isIP(str) { var IP = '(25[0-5]|2[0-4]\\d|1\\d\\d|\\d\\d|\\d)'; var IPdot = IP + '\\.'; var ...
- Python全栈--7模块--random os sys time datetime hashlib pickle json requests xml
模块分为三种: 自定义模块 内置模块 开源模块 一.安装第三方模块 # python 安装第三方模块 # 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+py ...
- Asp.net web api部署在某些服务器上老是404
asp.net web api部署在Windows服务器上后,按照WebAPI定义的路由访问,老是出现404,但定义一个静态文件从站点访问,却又OK. 这时,便可以确定是WebAPI路由出了问题,经调 ...
- VS2010无法修改资源文件
最近,因为公司开发的需要,对开发环境进行全面的升级,在这其中也遇到了不少问题,在之后将陆续整理出来,以便以后查看. 之前开发环境:VS2008,ArcGIS9.3,ArcEngine9.3,Oracl ...
- shell脚本批量处理字符串
上周五运营那边给了一份手机号码的excle,要求查询出所有对应于用户编号的用户的信息.这个时候遇到了一个问题就是,需要查询的用户数量很多,不可能一个一个去查,而excle中的格式又不符合sqlquer ...
- c# 程序检测日志输出的类
public class LogWrite { public LogWrite() { // // TODO: ...