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

    image

    3.写Model层代码

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

    image

    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.三层的扩展

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

    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

    更多精彩内容请看:http://www.cnblogs.com/2star
  • 相关阅读:
    ICO图标的制作、下载
    网页Loading,让页面加载完再显示
    鹏城之行
    The shit live,learn to give up!
    缘分
    一篇网络文章,能否让我真正顿悟???
    李开复给中国学生的第三封信:成功、自信、快乐
    Uncountable missing,missing...
    李开复给中国学生的第五封信:做个积极主动的你
    李开复给中国学生的第四封信:大学应这样过
  • 原文地址:https://www.cnblogs.com/kimisme/p/4200234.html
Copyright © 2020-2023  润新知