zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    2016"百度之星"
    codeforces 55 div2 C.Title 模拟
    codeforces 98 div2 C.History 水题
    codeforces 97 div2 C.Replacement 水题
    codeforces 200 div2 C. Rational Resistance 思路题
    bzoj 2226 LCMSum 欧拉函数
    hdu 1163 九余数定理
    51nod 1225 余数的和 数学
    bzoj 2818 gcd 线性欧拉函数
    Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学
  • 原文地址:https://www.cnblogs.com/kimisme/p/4200234.html
Copyright © 2011-2022 走看看