首页 > C#学习-EF在三层中使用

C#学习-EF在三层中使用

1.搭建普通三层

DAL层,BLL层,Model层,Web层;

DAL层引用Model层

BLL层引用DAL层和Model层

Web层引用BLL层和Model层

image

2.实现EF三层的搭建(添加引用,修改配置信息)

2.1添加EF对象

在Model中添加一个ADO.NET实体数据集

image

2.2添加引用信息

在DAL层中添加引用,EntityFramework.dll在你创建的解决方案文件夹下的packages文件夹中。

image

这里有个注意:

添加的时候看看引用的EntityFramework.dll的版本是否跟Model中的EntityFramework.dll版本号相同,如果不同的话会出错。 右击dll,查看属性就可以看到详细信息。

image

2.3修改配置信息

将Model中的App.config与EntityFramework相关的配置全部复制过来,发现是在configuration根节点下

image

然后在Web层中的Web.config中,找到节点将上面三部分代码黏贴在最上端

image

3.写Model层代码

因为用的是DBFirst,所以EF自动为我们生成了Model层,

image

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, Expressionbool>> 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, Expressionbool>> 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 BaseBLL where 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, Expressionbool>> whereLambda, int pagesize, int pageIndex){return dal.GetPageList(orderLambda, whereLambda, pagesize, pageIndex);}}

创建其他对象的BLL方法时,只要继承父类就行了。

6.三层的扩展

通过上面步骤,我们搭建好了三层,创建了如下四个类

image

这个时候,如果在DAL中的User.cs中有个自己方法SayHello()

image

我们在BLL层中的User.cs,只是继承了BaseBLL.cs;而BaseBLL.cs中不存在SayHello()方法

image

也就是是说用上面的这几个步骤,还不能实现调用User.cs中的自己方法,

如果能获得DAL中User的对象就好了,就可以直接调用SayHello()方法了

那就在BLL父类中,定义一个操作DAL.User的数据操作对象;

然后通过调用该数据操作对象的方法,来调用SayHello()方法;

既然定义了一个DAL.User对象,就要实例化后才可使用,

但是父类中,无法确定要实例化的是哪一个类,那么就想到了在子类中对父类中的数据操作对象进行实例化;

因为不同子类,类型不同,初始化对象的方法也不一样,所以想到了抽象函数,没有方法体;

通过上面整理,得到添加的代码如下:

BaseBLL.cs

image

BLL层中的User.cs

image

DAL层中User.cs

image

转载于:https://www.cnblogs.com/kimisme/p/4200234.html

更多相关:

  • 有时候我们项目,在执行某个操作后,会生成一些数据结果,如报表一类的东西,我们需要对结果进行保存,甚至是生成word文档。 那么首先获取到控件快照就最基本的条件。 生成快照的静态方法类 using System; using System.Collections.Generic; using System.Drawing; using...

  • 作用批量执行sql语句 表达式.RunSQL(SQLStatement,UseTransaction) 表达式.一个代表DoCmd对象的变量。 注释:sqlstatement参数的最大长度为 32,768 个字符(而"宏"窗口中的 SQL 语句操作参数的最大长度为 256 个字符)。      官方说仅能用于Microsoft Acc...

  • 前戏:针对上一篇列出来的功能点,今天和大家分享下这个自定义的公式是怎么设计的,由于我的第一篇博客在首页被管理员移走了,大家可以点击这里来跳转,看下第一篇的目录结构。本人作为老菜鸟,和大家分享的也是一些老菜鸟的想法,大神千万别喷我.   设计背景:当初为什么要设计这个自定义的计算公式呢,原因就是,这个价格是不确定的,计算方式也是不确定的...

  • 背景 搭建一个适合公司erp业务的开发平台。 架构概要图:    流程引擎开发平台:  包含流程引擎设计器,流程管理平台,流程引擎服务。目前只使用单个数据库进行管理。  流程引擎设计器    采用silverlight进行开发,本质是对流程模型进行设计,并生成xml。包含:人工节点,自动节点,并行开始节点,并行结束节点,消息节点,文...

  • using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;using System.Web; namespace BLL{    public  class XmlDoc    {       ...

  • 来源:公众号|计算机视觉工坊(系投稿)作者:仲夏夜之星「3D视觉工坊」技术交流群已经成立,目前大约有12000人,方向主要涉及3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、...

  • 点云PCL免费知识星球,点云论文速读。文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles作者:Ern˝o Horváth  , Claudiu Pozna ,and Miklós Unger编译:点云PCL代码:http...

  • 文章:Semantic Histogram Based Graph Matching for Real-Time Multi-Robot Global Localization in Large Scale Environment作者:Xiyue Guo, Junjie Hu, Junfeng Chen, Fuqin Deng, T...

  • 点云PCL免费知识星球,点云论文速读。文章:Robust Place Recognition using an Imaging Lidar作者:Tixiao Shan, Brendan Englot, Fabio Duarte, Carlo Ratti, and Daniela Rus编译:点云PCL(ICRA 2021)开源代码:...

  • 文章:A Survey of Calibration Methods for Optical See-Through Head-Mounted Displays作者:Jens Grubert , Yuta Itoh, Kenneth Moser编译:点云PCL本文仅做学术分享,如有侵权,请联系删除。欢迎各位加入免费知识星球,获取PD...