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

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

时间: 2024-11-05 11:43:07

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

MVC4 学习笔记 之 URL中存在编译的空格 20%20%

/Config/Edit/QQCC%20%20%20%20%20%20%20 原因是: 通过EF直接添加了空格? NO 是因为你的数据库字段设计问题,因为你当然设计如>:sID nchar(10) 那你一定想输入10个字符,但实际你只输入了必个,所以后面数据自动帮你补空了. 从EF数据库取出数据,在绑定的时候为安全,编码了,所以显示%20,代表一个空格. MVC4 学习笔记 之 URL中存在编译的空格 20%20%,布布扣,bubuko.com

(转) 深度学习在目标跟踪中的应用

深度学习在目标跟踪中的应用 原创 2016-09-05 徐霞清 深度学习大讲堂 点击上方“深度学习大讲堂”可订阅哦!深度学习大讲堂是高质量原创内容的平台,邀请学术界.工业界一线专家撰稿,致力于推送人工智能与深度学习最新技术.产品和活动信息! 开始本文之前,我们首先看上方给出的3张图片,它们分别是同一个视频的第1,40,80帧.在第1帧给出一个跑步者的边框(bounding-box)之后,后续的第40帧,80帧,bounding-box依然准确圈出了同一个跑步者.以上展示的其实就是目标跟踪(vis

三层中的大学问

最近也进展到了三层的学习,看了一些三层的相关的资料, 才逐渐的认识到三层的概念. 当初没看之前,在学习软件工程的时候,就曾设想过一个项目 的流程也应该大致的包括三部分:需求分析.业务逻辑处理.数 据库.而当面对三层的时候,才恍然大悟,这不就是三层的影子 吗?三层到底是何方神圣呢,下面先看一副图片. 大家设想一下,我们平常去饭店吃饭的场景,前脚刚进去, 服务员就笑嘻嘻的来迎接你,把你点的菜肴,交给头大的伙夫, 伙夫通过后勤人员提前准备好的菜,来做出美味的佳肴,最后再 次通过服务员反馈给你. 想一下

linux学习资料持续更新中

一.LINUX基础教程 1.老男孩系列免费视频: 1) linux高薪入门实战视频教程(第二部)老男孩linux教程 http://edu.51cto.com/course/course_id-1035-page-1.html 2) 跟着老男孩从0开始一步步实战深入学习linux运维(三) http://edu.51cto.com/lesson/id-11909.html linux学习资料持续更新中,布布扣,bubuko.com

针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码。

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码.本章我们的目标是使用Unity的脚本打开Activity.首先我们创建一个普通的Android

【算法导论学习-015】数组中选择第i小元素(Selection in expected linear time)

1.算法思想 问题描述:从数组array中找出第i小的元素(要求array中没有重复元素的情况),这是个经典的"线性时间选择(Selection in expected linear time)"问题. 思路:算法导论215页9.2 Selection in expect linear time 2.java实现 思路:算法导论216页伪代码 /*期望为线性时间的选择算法,输入要求,array中没有重复的元素*/ public static int randomizedSelect(i

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

之前在写应用模块,进行单元测试编码的时候,居然脑洞大开居然创建了一个 N 层的目录,到后来删除测试结果目录的时候,才发现删除不了了,提示目录过长无法删除.网上找了一些方法,也找了一些粉碎机,都没能达到想要的结果,我就简写了一个小应用,用于删除自己脑洞大开创建的级联目录.此小应用没有代码注释,也没有进行容错处理,请大家知悉!哈哈哈哈哈.....若发现有错误,也请告知,我会去修改订正,非常感谢! 闲话少述,直接上码了! 1 /** 2 * Aaron.ffp Inc. 3 * Copyright (

Guava学习笔记:guava中的Preconditions使用

Guava学习笔记:guava中的Preconditions使用 转载:http://outofmemory.cn/java/guava/base/Preconditions google guava的base包中提供的Preconditions类用来方便的做参数的校验,他主要提供如下方法: checkArgument 接受一个boolean类型的参数和一个可选的errorMsg参数,这个方法用来判断参数是否符合某种条件,符合什么条件google guava不关心,在不符合条件时会抛出Illeg

[原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构

在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构:  (1) AVFormatContext  AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数.FFmpeg代码中对这个数据结构的注释是:format I/O context 此结构包含了一个视频流的格式内容.其中存有了AVInputFormat(or AVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream.AVPack