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中,找到节点<configuration></configuration>将上面三部分代码黏贴在最上端

3.写Model层代码

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

4.写DAL层代码

4.1先书写具体某个对象的DAL方法

class User
{
//创建数据上下文
static Model.MyDBEntities context = new MyDBEntities();
/// <summary>
/// 添加 实体
/// </summary>
/// <param name="model">传入一个实体</param>
/// <returns></returns>
public int Add(Model.Users model)
{
context.Users.Add(model);
return context.SaveChanges();
}
/// <summary>
/// 根据条件 删除 数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public int Del(Model.Users model)
{
context.Users.Attach(model);
context.Users.Remove(model);
return context.SaveChanges();
}
/// <summary>
/// 修改 数据
/// </summary>
/// <param name="model">要修改成的数据</param>
/// <param name="proName">要修改的列名</param>
/// <returns></returns>
public int Modify(Model.Users model, params string[] proName)
{
DbEntityEntry<Model.Users> entityEntry = context.Entry<Model.Users>(model);
entityEntry.State = EntityState.Unchanged;
foreach (string s in proName)
{
//将要修改的列 标识为修改
entityEntry.Property(s).IsModified = true;
}
return context.SaveChanges();
}
/// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="TKey">排序的字段的类型</typeparam>
/// <param name="orderLambda">按上面方式排序,升序还是降序</param>
/// <param name="whereLambda">分页的Where条件</param>
/// <param name="pagesize">每页多少条数据</param>
/// <param name="pageIndex">当前第几页</param>
/// <returns></returns>
public List<Model.Users> GetPageList<TKey>(Expression<Func<Model.Users, TKey>> orderLambda, Expression<Func<Model.Users, bool>> whereLambda, int pagesize, int pageIndex)
{
return context.Users.Where(whereLambda)
.OrderBy(orderLambda)
.Skip((pageIndex - 1) * pagesize)
.Take(pagesize)
.Select(u => u).ToList();
} }

因为其他对象,也是使用类似的方法,这个时候就想到了泛型,将以上方法修改成泛型,改写成一个DAL的基类,代码如下

/// <summary>
/// T为引用类型,且有个无参的构造函数
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseDAL<T> where T:class ,new()
{
static Model.MyDBEntities context = new MyDBEntities(); public int Add(T model)
{
context.Set<T>().Add(model);
return context.SaveChanges();
}
public int Del(T model)
{
context.Set<T>().Attach(model);
context.Set<T>().Remove(model);
return context.SaveChanges();
}
public int Modify(T model, params string[] proName)
{
DbEntityEntry<T> entityEntry = context.Entry<T>(model);
entityEntry.State = EntityState.Unchanged;
foreach (string s in proName)
{
entityEntry.Property(s).IsModified = true;
}
return context.SaveChanges();
} public List<T> GetPageList<TKey>(Expression<Func<T, TKey>> orderLambda, Expression<Func<T, bool>> whereLambda, int pagesize, int pageIndex)
{
return context.Set<T>().Where(whereLambda)
.OrderBy(orderLambda)
.Skip((pageIndex - 1) * pagesize)
.Take(pagesize)
.Select(u => u).ToList();
} }

创建其他对象的DAL层方法时,只要继承父类就可以了

5.写BLL层方法

BLL层方法,就是把DAL层方法复制过来,然后去掉方法体,就可以了

public class BaseBLL<T> where T:class,new()
{
BaseDAL<T> dal=new BaseDAL<T>(); 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<T> GetPageList<TKey>(Expression<Func<T, TKey>> orderLambda, Expression<Func<T, 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

C#学习-EF在三层中使用的更多相关文章

  1. MVC学习笔记(三)—用EF向数据库中添加数据

    1.在EFDemo文件夹中添加Controllers文件夹(用的是上一篇MVC学习笔记(二)—用EF创建数据库中的项目) 2.在Controllers文件夹下添加一个空的控制器(StudentsCon ...

  2. 学习EF之CodeFirst一

    最近将花点时间学习EF相关知识,通过文章来进行一个完整的学习,Code First是由先有代码后生成数据库:将通过一实例来进行学习:我们简单分为三层,其中DataLibrary为EF上下文处理层,Mo ...

  3. SSH 框架学习之初识Java中的Action、Dao、Service、Model-收藏

    SSH 框架学习之初识Java中的Action.Dao.Service.Model-----------------------------学到就要查,自己动手动脑!!!   基础知识目前不够,有感性 ...

  4. 6.翻译系列:EF 6 Code-First中数据库初始化策略(EF 6 Code-First系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-firs ...

  5. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

  6. 前端学习 第二弹: JavaScript中的一些函数与对象(1)

    前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...

  7. Java学习-040-级联删除目录中的文件、目录

    之前在写应用模块,进行单元测试编码的时候,居然脑洞大开居然创建了一个 N 层的目录,到后来删除测试结果目录的时候,才发现删除不了了,提示目录过长无法删除.网上找了一些方法,也找了一些粉碎机,都没能达到 ...

  8. 今天学习image在html中的应用

    今天学习image在html中的应用 上次在学习超级链接的使用中有一小问题,是在添加网址中href="http://www.baidu.com" 中不能忘记http://,否则链接 ...

  9. VC++学习之网络编程中的套接字

    VC++学习之网络编程中的套接字 套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问 ...

随机推荐

  1. [bzoj4994][Usaco2017 Feb]Why Did the Cow Cross the Road III_树状数组

    Why Did the Cow Cross the Road III bzoj-4994 Usaco-2017 Feb 题目大意:给定一个长度为$2n$的序列,$1$~$n$个出现过两次,$i$第一次 ...

  2. 消息队列RabbitMQ使用教程收集

    学习应该要系统,最好的方式是看书. RabbitMQ最权威的教程应该参考官方文档. 下面是收集的一些教程: 官方: https://www.rabbitmq.com/getstarted.html h ...

  3. Memcached与Spring集成的方式(待实践)

    主要是基于这几种方式http://www.cnblogs.com/EasonJim/p/7624822.html去实现与Spring集成,而个人建议使用Xmemcached去集成好一些,因为现在官方还 ...

  4. 浏览器判断是否安装了ios/android客户端程序

    最近在做一个项目,该项目的前身是为mobile browser量身打造的一个网站.现在有这样一个需求: 当用户在用mobile browser浏览该网站的时候会点击一个按钮/超链接,通过这个按钮的点击 ...

  5. C++求解数组中出现超1/4的三个数字。

    #include <iostream> using namespace std; //求x!中k因数的个数. int Grial(int x,int k) { int Ret = 0; w ...

  6. Android之——jni通用工具方法

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47002207 1.将java字符串转化为c++字符串 /** *工具方法 *将ja ...

  7. WEB端应该使用DataTable/DataSet吗?

    有一次和同事讨论起具体的技术细节,同事说不要用什么实体类,从数据库访问到的数据,直接用DataTable.DataSet 就好.理由是,从获取到的数据集转换成实体类,有一定的性能损耗. 呵呵,性能.我 ...

  8. ios28--UIScrollView

    // // ViewController.m // UIScrollVIew #import "ViewController.h" @interface ViewControlle ...

  9. MPMoviePlayerController属性方法简介

    属性 说明 @property (nonatomic, copy) NSURL *contentURL 播放媒体URL,这个URL可以是本地路径,也可以是网络路径 @property (nonatom ...

  10. 怎么在当前的view上获取所在的控制器(UIViewController),实现跳转

    - (UIViewController *)viewController { for (UIView* next = [self superview]; next; next = next.super ...