• ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)数据库访问层的设计Demo


       ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建

      前言:这篇博客我们继续来实现我的权限系列,这个博客一段时间也没有写了,重点是我在想还写不写,最终我决定还是写下去,因为我们是为了学习,当别人提出意见的时候,我们可以参考和采纳,但是我们不一定非要采纳,上几篇博客大家都说用CodeFirst来实现,是啊,现在基本很少有人用我的这种方法来实现了,都是用CodeFirst来实现,但是我写这篇博客的目的不是为了学多少东西,而是为了学一种编程的思想,所以我今天继续这个话题我们聊下去。

    1.模型设计

      (1)今天我们先来初步的设计一下模型的搭建,也就是我们在edmx文件下面搭建出我们自己设计的实体对象,添加实体的步骤我就在这里不罗嗦了,大家看图就能够设计出来,如图所示:

         

      (2) 解释:UserInfo(用户表)实体表里面的UName的属性最大长度为32,可以为Null为true,其他默认,Pwd的属性最大长度为16,可以为Null为true,其他默认,

      (3) Role(角色)表里面的RoleName的属性最大长度为32,可以为Null为true,其他默认。

      (4) 注意:当我们添加实体的时候,选择添加实体集的时候后面会有一个“集”字,我们记得要删除它

      (5)当我们设计完这个简单的Demo之后,我们将使用模型的关系生成数据库,这个步骤我也不往出来写了,相信有一点基础的同学都知道该如何实现。

    2.搭建架构-设计数据访问层

      (1)我们在数据库访问层(LYZJ.UserLimitMVC.DAL) 下面添加UserInfoRepository(用户仓储),RoleRepository(角色仓储),这些功能是为了实现对数据库的操作,也就是增删改查,注意了,这里会有一个问题,我们的用户和角色都会用到数据库的操作(增删改查),那么我们怎么办呢,想必这里大家已经清楚该怎么办了,当我们遇到公共的东西的时候我们最好能够抽象出来实现一个固定的功能的基类,然后我们只对其进行继承操作。

      (2) 我们的Demo设计的数据库访问层的架构如图所示:

            

    3.对基类(BaseRepository(仓储))操作数据库(增删改查)的实现。

      (1)添加引用

           当我们对基类进行操作的时候,我们需要用到我们刚才建立的实体的DLL和使用Entity FrameWork操作数据库的DLL,下面我们在数据库访问层添加这两个引用,分别是:LYZJ.UserLimitMVC.Model,System.Data.Entity。

      (2)对基类(BaseRepository)操作数据库的实现方法,含有增删改查和分页查询,代码如下:

      1 using System.Data;
      2 
      3 using LYZJ.UserLimitMVC.Model;
      4 
      5 using System;
      6 
      7 using System.Collections.Generic;
      8 
      9 using System.Linq;
     10 
     11 using System.Text;
     12 
     13 using System.Threading.Tasks;
     14 
     15  
     16 
     17 namespace LYZJ.UserLimitMVC.DAL
     18 
     19 {
     20 
     21     /// <summary>
     22 
     23     /// 实现对数据库的操作(增删改查)的基类
     24 
     25     /// </summary>
     26 
     27     /// <typeparam name="T">定义泛型,约束其是一个类</typeparam>
     28 
     29     public class BaseRepository<T> where T : class
     30 
     31     {
     32 
     33         //创建EF框架的上下文
     34 
     35         private DataModelContainer db = new DataModelContainer();
     36 
     37  
     38 
     39         // 实现对数据库的添加功能,添加实现EF框架的引用
     40 
     41         public T AddEntity(T entity)
     42 
     43         {
     44 
     45             //EF4.0的写法   添加实体
     46 
     47             //db.CreateObjectSet<T>().AddObject(entity);
     48 
     49             //EF5.0的写法
     50 
     51             db.Entry<T>(entity).State = EntityState.Added;
     52 
     53  
     54 
     55             //下面的写法统一
     56 
     57             db.SaveChanges();
     58 
     59             return entity;
     60 
     61         }
     62 
     63  
     64 
     65         //实现对数据库的修改功能
     66 
     67         public bool UpdateEntity(T entity)
     68 
     69         {
     70 
     71             //EF4.0的写法
     72 
     73             //db.CreateObjectSet<T>().Addach(entity);
     74 
     75             //db.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
     76 
     77             //EF5.0的写法
     78 
     79             db.Set<T>().Attach(entity);
     80 
     81             db.Entry<T>(entity).State = EntityState.Modified;
     82 
     83  
     84 
     85             return db.SaveChanges() > 0;
     86 
     87         }
     88 
     89  
     90 
     91         //实现对数据库的删除功能
     92 
     93         public bool DeleteEntity(T entity)
     94 
     95         {
     96 
     97             //EF4.0的写法
     98 
     99             //db.CreateObjectSet<T>().Addach(entity);
    100 
    101             //db.ObjectStateManager.ChangeObjectState(entity, EntityState.Deleted);
    102 
    103             //EF5.0的写法
    104 
    105             db.Set<T>().Attach(entity);
    106 
    107             db.Entry<T>(entity).State = EntityState.Deleted;
    108 
    109  
    110 
    111             return db.SaveChanges() > 0;
    112 
    113         }
    114 
    115  
    116 
    117         //实现对数据库的查询  --简单查询
    118 
    119         public IQueryable<T> LoadEntities(Func<T, bool> whereLambda)
    120 
    121         {
    122 
    123             //EF4.0的写法
    124 
    125             //return db.CreateObjectSet<T>().Where<T>(whereLambda).AsQueryable();
    126 
    127             //EF5.0的写法
    128 
    129             return db.Set<T>().Where<T>(whereLambda).AsQueryable();
    130 
    131         }
    132 
    133  
    134 
    135         /// <summary>
    136 
    137         /// 实现对数据的分页查询
    138 
    139         /// </summary>
    140 
    141         /// <typeparam name="S">按照某个类进行排序</typeparam>
    142 
    143         /// <param name="pageIndex">当前第几页</param>
    144 
    145         /// <param name="pageSize">一页显示多少条数据</param>
    146 
    147         /// <param name="total">总条数</param>
    148 
    149         /// <param name="whereLambda">取得排序的条件</param>
    150 
    151         /// <param name="isAsc">如何排序,根据倒叙还是升序</param>
    152 
    153         /// <param name="orderByLambda">根据那个字段进行排序</param>
    154 
    155         /// <returns></returns>
    156 
    157         public IQueryable<T> LoadPageEntities<S>(int pageIndex, int pageSize, out  int total, Func<T, bool> whereLambda,
    158 
    159             bool isAsc, Func<T, S> orderByLambda)
    160 
    161         {
    162 
    163             //EF4.0和上面的查询一样
    164 
    165             //EF5.0
    166 
    167             var temp = db.Set<T>().Where<T>(whereLambda);
    168 
    169             total = temp.Count(); //得到总的条数
    170 
    171             //排序,获取当前页的数据
    172 
    173             if (isAsc)
    174 
    175             {
    176 
    177                 temp = temp.OrderBy<T, S>(orderByLambda)
    178 
    179                      .Skip<T>(pageSize * (pageIndex - 1)) //越过多少条
    180 
    181                      .Take<T>(pageSize).AsQueryable(); //取出多少条
    182 
    183             }
    184 
    185             else
    186 
    187             {
    188 
    189                 temp = temp.OrderByDescending<T, S>(orderByLambda)
    190 
    191                     .Skip<T>(pageSize*(pageIndex - 1)) //越过多少条
    192 
    193                     .Take<T>(pageSize).AsQueryable(); //取出多少条
    194 
    195             }
    196 
    197             return temp.AsQueryable();
    198 
    199         }
    200 
    201     }
    202 
    203 }

    4.继承实现用户和角色的操作数据库的方法

     (1)当我们写完操作数据库的基类的时候,这时候我们就要对用户和角色实现对数据库的操作,我在上面就说了,这时候我们可以使用继承基类来直接实现对数据库的操作。

     (2)用户仓储(UserInfoRepository继承基类的代码

     1 namespace LYZJ.UserLimitMVC.DAL
     2 
     3 {
     4     public class UserInfoRepository:BaseRepository<UserInfo>
     5 
     6     {
     7 
     8     }
     9 
    10 }

     (3)角色仓储(RoleRepository)继承基类的代码

    1 namespace LYZJ.UserLimitMVC.DAL
    2 
    3 {
    4     public class RoleRepository : BaseRepository<Role>
    5 
    6     {
    7 
    8     }
    9 }

    5.图形总结流程-对此代码实现的图形总结

     (1)到这里,我们的这篇博客算是写完了,当然很多东西我们没有实现,而且也看不到效果,我现在会加快速度让大家看到效果,在最后我将画一张图来说明一下这个实现的效果,如图所示:

       

     (2)下篇博客我们开始讨论面向接口的编程。期待中,晚上回来继续完成。

    源码下载

       (1):完整源码下载

      

      Kencery返回本系列开篇

      

  • 相关阅读:
    ImageView的属性android:scaleType
    Java容器类List、ArrayList、Vector及map、HashTable、HashMap分别的区别. (转)
    Pro Andorid3第一章:Android平台简介
    Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
    归纳法(induction)
    dual graph
    Project和编程过程
    维度
    dos
    关于glfrustum与hemicube的真实长度的关系
  • 原文地址:https://www.cnblogs.com/hanyinglong/p/3002090.html
Copyright © 2020-2023  润新知