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返回本系列開篇

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM