今天我们主要讨论下数据层父类和业务层父类的使用。众所周知,数据层无非就是实现增删改查的方法。无论是哪个实体类,无非就是为了实现增删改查方法,所有我们在三层的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. 转载:mysql ODBC 在64位下提示找不到odbc驱动问题

    在64位机器上,如果你想要连接32位mysql ,一般会安装mysql connector/ODBC 64位,并在配置ODBC数据源测试中连接正常,但在程序连接,如ASP.asp.net.VB.Del ...

  2. BootLoader 详解(1)

    1. Boot Loader的概念 BootLoader就是在操作系统内核运行前之前运行的一段小程序.通过这段小程序,可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件带到一个合适的状态,以便 ...

  3. CentOS使用virtualenv搭建独立的Python环境-python虚拟环境

    CentOS使用virtualenv搭建独立的Python环境-python虚拟环境 virtualenv可以搭建虚拟且独立的python环境,可以使每个项目环境与其他项目独立开来,保持环境的干净,解 ...

  4. 查看真机的APP沙盒文件

    1.Xcode --> window --> devices -->左边选择设备 右下边选择要查看的app 双击应用可查看目录 点击设置按钮,选 Download Container ...

  5. 使用 RecyclerView

    使用 RecyclerView android RecyclerView tutorial 概述 与 ListView 的对比 RecyclerView 的组件 LayoutManager Recyc ...

  6. iterator 及 迭代器模式(转发)

    Iterator definitions An iterator is any object that, pointing to some element in a range of elements ...

  7. andorid Activity和Service音乐播放器

    AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xm ...

  8. python 写文件,utf-8问题

    写文件报数据. 同样的编码. 含中文字段的输出文件 编码为utf-8 无中文的却是asc import codecstxt = u”qwer”file=codecs.open(“test”,”w”,” ...

  9. apache的虚拟目录的配置

    第一步:在httpd.conf底部添加以下代码.表示添加虚拟目录 1 <IfModule dir_module> #direcotory相当于是欢迎页面 DirectoryIndex in ...

  10. Oracle 建表,递增序列,触发器,分析函数row_number() ,partition by 子句。

    create table SC ( Id INTEGER, Name nvarchar2(20) , KC_Name nvarchar2(20), KC_score INTEGER , constra ...