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