t4b代码生成_使用T4模板批量生成代码

前言:这篇博客我们继续来实现我的权限系列,这个博客一段时间也没有写了,重点是我在想还写不写,最终我决定还是写下去,因为我们是为了学习,当别人提出意见的时候,我们可以参考和采纳,但是我们不一定非要采纳,上几篇博客大家都说用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 usingSystem.Data;2

3 usingLYZJ.UserLimitMVC.Model;4

5 usingSystem;6

7 usingSystem.Collections.Generic;8

9 usingSystem.Linq;10

11 usingSystem.Text;12

13 usingSystem.Threading.Tasks;14

15

16

17 namespaceLYZJ.UserLimitMVC.DAL18

19 {20

21 ///

22

23 ///实现对数据库的操作(增删改查)的基类24

25 ///

26

27 /// 定义泛型,约束其是一个类

28

29 public class BaseRepository where T : class

30

31 {32

33 //创建EF框架的上下文

34

35 private DataModelContainer db = newDataModelContainer();36

37

38

39 //实现对数据库的添加功能,添加实现EF框架的引用

40

41 publicT AddEntity(T entity)42

43 {44

45 //EF4.0的写法 添加实体46

47 //db.CreateObjectSet().AddObject(entity);48

49 //EF5.0的写法

50

51 db.Entry(entity).State =EntityState.Added;52

53

54

55 //下面的写法统一

56

57 db.SaveChanges();58

59 returnentity;60

61 }62

63

64

65 //实现对数据库的修改功能

66

67 public boolUpdateEntity(T entity)68

69 {70

71 //EF4.0的写法72

73 //db.CreateObjectSet().Addach(entity);74

75 //db.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);76

77 //EF5.0的写法

78

79 db.Set().Attach(entity);80

81 db.Entry(entity).State =EntityState.Modified;82

83

84

85 return db.SaveChanges() > 0;86

87 }88

89

90

91 //实现对数据库的删除功能

92

93 public boolDeleteEntity(T entity)94

95 {96

97 //EF4.0的写法98

99 //db.CreateObjectSet().Addach(entity);100

101 //db.ObjectStateManager.ChangeObjectState(entity, EntityState.Deleted);102

103 //EF5.0的写法

104

105 db.Set().Attach(entity);106

107 db.Entry(entity).State =EntityState.Deleted;108

109

110

111 return db.SaveChanges() > 0;112

113 }114

115

116

117 //实现对数据库的查询 --简单查询

118

119 public IQueryable LoadEntities(FuncwhereLambda)120

121 {122

123 //EF4.0的写法124

125 //return db.CreateObjectSet().Where(whereLambda).AsQueryable();126

127 //EF5.0的写法

128

129 return db.Set().Where(whereLambda).AsQueryable();130

131 }132

133

134

135 ///

136

137 ///实现对数据的分页查询138

139 ///

140

141 /// 按照某个类进行排序

142

143 /// 当前第几页

144

145 /// 一页显示多少条数据

146

147 /// 总条数

148

149 /// 取得排序的条件

150

151 /// 如何排序,根据倒叙还是升序

152

153 /// 根据那个字段进行排序

154

155 ///

156

157 public IQueryable LoadPageEntities(int pageIndex, int pageSize, out int total, FuncwhereLambda,158

159 bool isAsc, FuncorderByLambda)160

161 {162

163 //EF4.0和上面的查询一样164

165 //EF5.0

166

167 var temp = db.Set().Where(whereLambda);168

169 total = temp.Count(); //得到总的条数170

171 //排序,获取当前页的数据

172

173 if(isAsc)174

175 {176

177 temp = temp.OrderBy(orderByLambda)178

179 .Skip(pageSize * (pageIndex - 1)) //越过多少条

180

181 .Take(pageSize).AsQueryable(); //取出多少条

182

183 }184

185 else

186

187 {188

189 temp = temp.OrderByDescending(orderByLambda)190

191 .Skip(pageSize*(pageIndex - 1)) //越过多少条

192

193 .Take(pageSize).AsQueryable(); //取出多少条

194

195 }196

197 returntemp.AsQueryable();198

199 }200

201 }202

203 }

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

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

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

1 namespaceLYZJ.UserLimitMVC.DAL2

3 {4 public class UserInfoRepository:BaseRepository

5

6 {7

8 }9

10 }

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

1 namespaceLYZJ.UserLimitMVC.DAL2

3 {4 public class RoleRepository : BaseRepository

5

6 {7

8 }9 }

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值