1.搭建普通三层
DAL层,BLL层,Model层,Web层;
DAL层引用Model层
BLL层引用DAL层和Model层
Web层引用BLL层和Model层
2.实现EF三层的搭建(添加引用,修改配置信息)
2.1添加EF对象
在Model中添加一个ADO.NET实体数据集
2.2添加引用信息
在DAL层中添加引用,EntityFramework.dll在你创建的解决方案文件夹下的packages文件夹中。
这里有个注意:
添加的时候看看引用的EntityFramework.dll的版本是否跟Model中的EntityFramework.dll版本号相同,如果不同的话会出错。 右击dll,查看属性就可以看到详细信息。
2.3修改配置信息
将Model中的App.config与EntityFramework相关的配置全部复制过来,发现是在configuration根节点下
然后在Web层中的Web.config中,找到节点
3.写Model层代码
因为用的是DBFirst,所以EF自动为我们生成了Model层,
4.写DAL层代码
4.1先书写具体某个对象的DAL方法
class User {//创建数据上下文static Model.MyDBEntities context = new MyDBEntities();////// 添加 实体/// /// 传入一个实体/// public int Add(Model.Users model){context.Users.Add(model);return context.SaveChanges();}/// /// 根据条件 删除 数据/// /// /// public int Del(Model.Users model){context.Users.Attach(model);context.Users.Remove(model);return context.SaveChanges();}/// /// 修改 数据/// /// 要修改成的数据/// 要修改的列名/// public int Modify(Model.Users model, params string[] proName){DbEntityEntry entityEntry = context.Entry (model);entityEntry.State = EntityState.Unchanged;foreach (string s in proName){//将要修改的列 标识为修改entityEntry.Property(s).IsModified = true;}return context.SaveChanges();}/// /// 分页查询/// /// 排序的字段的类型/// 按上面方式排序,升序还是降序/// 分页的Where条件/// 每页多少条数据/// 当前第几页/// public List GetPageList (Expression > orderLambda, Expression bool>> whereLambda, int pagesize, int pageIndex){return context.Users.Where(whereLambda).OrderBy(orderLambda).Skip((pageIndex - 1) * pagesize).Take(pagesize).Select(u => u).ToList();}}
因为其他对象,也是使用类似的方法,这个时候就想到了泛型,将以上方法修改成泛型,改写成一个DAL的基类,代码如下
////// T为引用类型,且有个无参的构造函数 /// /// public class BaseDAL where T:class ,new() {static Model.MyDBEntities context = new MyDBEntities();public int Add(T model){context.Set ().Add(model);return context.SaveChanges();}public int Del(T model){context.Set ().Attach(model);context.Set ().Remove(model);return context.SaveChanges();}public int Modify(T model, params string[] proName){DbEntityEntry entityEntry = context.Entry (model);entityEntry.State = EntityState.Unchanged;foreach (string s in proName){entityEntry.Property(s).IsModified = true;}return context.SaveChanges();}public List GetPageList (Expression > orderLambda, Expression bool>> whereLambda, int pagesize, int pageIndex){return context.Set ().Where(whereLambda).OrderBy(orderLambda).Skip((pageIndex - 1) * pagesize).Take(pagesize).Select(u => u).ToList();}}
创建其他对象的DAL层方法时,只要继承父类就可以了
5.写BLL层方法
BLL层方法,就是把DAL层方法复制过来,然后去掉方法体,就可以了
public class BaseBLLwhere T:class,new() {BaseDAL dal=new BaseDAL (); public int Add(T model){return dal.Add(model);}public int Del(T model){return dal.Del(model);}public int Modify(T model, params string[] proName){return dal.Modify(model, proName);}public List GetPageList (Expression > orderLambda, Expression bool>> whereLambda, int pagesize, int pageIndex){return dal.GetPageList(orderLambda, whereLambda, pagesize, pageIndex);}}
创建其他对象的BLL方法时,只要继承父类就行了。
6.三层的扩展
通过上面步骤,我们搭建好了三层,创建了如下四个类
这个时候,如果在DAL中的User.cs中有个自己方法SayHello()
我们在BLL层中的User.cs,只是继承了BaseBLL.cs;而BaseBLL.cs中不存在SayHello()方法
也就是是说用上面的这几个步骤,还不能实现调用User.cs中的自己方法,
如果能获得DAL中User的对象就好了,就可以直接调用SayHello()方法了
那就在BLL父类中,定义一个操作DAL.User的数据操作对象; 然后通过调用该数据操作对象的方法,来调用SayHello()方法; 既然定义了一个DAL.User对象,就要实例化后才可使用, 但是父类中,无法确定要实例化的是哪一个类,那么就想到了在子类中对父类中的数据操作对象进行实例化; 因为不同子类,类型不同,初始化对象的方法也不一样,所以想到了抽象函数,没有方法体; |
通过上面整理,得到添加的代码如下:
BaseBLL.cs
BLL层中的User.cs
DAL层中User.cs