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调用数据 然后传递给 客户 ...
随机推荐
- java.lang.UnsupportedClassVersionError: xxx/xxxClass : Unsupported major.minor version 51.0
完全参考自 http://www.cnblogs.com/xing901022/p/4172410.html 这种错误的全部报错信息: 1 java.lang.UnsupportedClassVers ...
- POJ1201 区间
题目大意: 给定n个整数区间[ai,bi]和n个整数ci,求一个最小集合Z,满足|Z∩[ai,bi]|>=ci(Z里边在闭区间[ai,bi]的个数不小于ci). 多组数据: n(1<=n& ...
- python第十一天-----补:线程池
低版本: #!/usr/bin/env python import threading import time import queue class TreadPool: ""&q ...
- Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...
- DNS劫持和DNS污染的区别
我们知道,某些网络运营商为了某些目的,对DNS进行了某些操作,导致使用ISP的正常上网设置无法通过域名取得正确的IP地址.常用的手段有:DNS劫持和DNS污染. 什么是DNS劫持 DNS劫持就是通过劫 ...
- Winform中DockPanel(引用WeifenLuo.WinFormsUI.Docking.dll组件)的使用
WeiFenLuo.WinFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可实现像Visual Studio的窗口停靠.拖拽等功能.WeifenLuo.Win ...
- SUSE Linux Enterprise Server 11 软件源
1.添加软件源 zypper ar http://ftp5.gwdg.de/pub/opensuse/discontinued/distribution/11.4/repo/oss oss zyppe ...
- 关于内存数据与 JSON
闲话: 正在用 WebBroker 写一个小网站,感受颇多: 1.如果是写一个小东西,应该先考虑下 WebBroker,因为它是分分钟即可上手的. 2.如果要写一个大东西,或许也应该考虑下 WebBr ...
- 华为手机打开Logcat的方法
华为手机默认是关闭logcat信息的,这在开发调试时当然很不方便,打开log信息的方法如下 1. 进入拨号界面输入:*#*#2846579#*#* 2. 依次选择ProjectMenu---后台设置 ...
- C# 基础(6)--Winform
WinForm 简称,Windows Form ,调用.Net框架. Return 只是退出当前方法. MessageBox.Show("输入的Email地址是非法的!"); 把整 ...