前言
从上篇30岁找份程序员的工作(伪程序员的独白),文章开始,我说过我要用我自学的技术,来搭建一个博客系统,也希望大家给点意见,另外我很感谢博客园的各位朋友们,对我那篇算是自我阶段总结文章的评论,在里面能看出有很多种声音,有支持的我的朋友给我加油打气,有分享自己工作经历的朋友,有提出忠肯意见的朋友,有对记事本写代码吐槽的朋友,也有希望让我换个行业的,觉得我可能不适合这个行业朋友,不管怎样,我都接受,都是大家同行的一些忠告,谢谢大家。
首先我要在这里感谢很多博客园里面的大牛,写了很多系列,很多学习资料,让我受益很多,有机会找个时间,我会把我浏览器中收藏的资源都整理出来,分享给大家,其实我会的这些都是自己在博客园看到的文章、在某宝买的视频、QQ群里看群主的分享公开课学的,希望大家多提宝贵意见。
一、框架搭建
首先创建几个文件夹:
01Data用来放链接数据的EF以及创建表的类;
02Core存放数据仓储一些跟数据库链接实现数据操作的部分:
03Services 用于存放业务逻辑处理;
04Common用于放公共应用的工具之类;
05UI mvc页面展示的就放在这里 以及web相关的核心代码
其中除了Wchl.CRM.WebUI创建的是MVC5应用程序,其他的都是创建类库
二、创建数据库
1.创建一个空的EF code frist环境,输入的名字为WMBlogDB
2、选择空的Code Frist模型
3、创建一个models文件存放所有表的类,这里先创建一个用户信息表的类sysUserInfo
sysUserInfo类:
1 namespace Wchl.WMBlog.Model.Models 2 { 3 public class sysUserInfo 4 { 5 ///6 /// 用户ID 7 /// 8 public int uID { get; set; } 9 /// 10 /// 登录账号 11 /// 12 public string uLoginName { get; set; } 13 /// 14 /// 登录密码 15 /// 16 public string uLoginPWD { get; set; } 17 /// 18 /// 真实姓名 19 /// 20 public string uRealName { get; set; } 21 /// 22 /// 状态 23 /// 24 public int uStatus { get; set; } 25 /// 26 /// 备注 27 /// 28 public string uRemark { get; set; } 29 /// 30 /// 创建时间 31 /// 32 public System.DateTime uCreateTime { get; set; } 33 /// 34 /// 更新时间 35 /// 36 public System.DateTime uUpdateTime { get; set; } 37 } 38 }
4、创建一个maps文件夹,主要是用来放对表字段进行约束的类sysUserInfoMap
sysUserInfoMap类:
1 namespace Wchl.WMBlog.Model.Maps 2 { 3 public class sysUserInfoMap:EntityTypeConfiguration4 { 5 public sysUserInfoMap() 6 { 7 this.HasKey(u => u.uID); 8 this.Property(u => u.uLoginName).HasMaxLength(60); 9 this.Property(u => u.uLoginPWD).HasMaxLength(60); 10 this.Property(u => u.uRealName).HasMaxLength(60); 11 } 12 } 13 }
关于EntityTypeConfiguration类的用法,大家可以去看看博客园里面一些介绍文章,HasKey设置主键,HasMaxLength字段最大长度。
5、在控制台中创建数据库脚本 Enable-Migrations
6、修改Configuration类配置
7、在WMBlogDB类中重写OnModelCreating方法
重写OnModelCreating方法:
1 protected override void OnModelCreating(DbModelBuilder modelBuilder) 2 { 3 //移除表名为复数 4 modelBuilder.Conventions.Remove(); 5 //自动添加实现EntityTypeConfiguration的类 6 modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly()); 7 base.OnModelCreating(modelBuilder); 8 }
二、仓储层建设
1、在Wchl.WMBlog.IRepository中创建一个类,做为操作数据的父接口IBaseRepository,这里使用泛型来创建
IBaseRepository接口
1 namespace Wchl.WMBlog.IRepository.Base 2 { 3 public interface IBaseRepositorywhere TEntity:class 4 { 5 #region 查询 6 /// 7 /// 单表查询 8 /// 9 /// 10 /// 11 List QueryWhere(Expression bool>> predicate); 12 13 /// 14 /// 多表关联查询 15 /// 16 /// 17 /// 18 /// 19 List QueryJoin(Expression bool>> predicate, string[] tableNames); 20 /// 21 /// 升序查询还是降序查询 22 /// 23 /// 24 /// 25 /// 26 /// 27 /// 28 List QueryOrderBy (Expression bool>> predicate, Expression > keySelector, bool IsQueryOrderBy); 29 30 /// 31 /// 升序分页查询还是降序分页 32 /// 33 /// 34 /// 第几页 35 /// 一页多少条 36 /// 返回共多少条 37 /// 查询条件 38 /// 排序字段 39 /// true为升序 false为降序 40 /// 41 List QueryByPage (int pageIndex, int pagesize, out int rowcount, Expression bool>> predicate, Expression > keySelector, bool IsQueryOrderBy); 42 #endregion 43 44 #region 编辑 45 /// 46 /// 通过传入的model加需要修改的字段来更改数据 47 /// 48 /// 49 /// 50 void Edit(TEntity model, string[] propertys); 51 52 /// 53 /// 直接查询之后再修改 54 /// 55 /// 56 void Edit(TEntity model); 57 #endregion 58 59 #region 删除 60 void Delete(TEntity model, bool isadded); 61 #endregion 62 63 #region 新增 64 void Add(TEntity model); 65 #endregion 66 67 #region 统一提交 68 int SaverChanges(); 69 #endregion 70 71 #region 调用存储过程返回一个指定的TResult 72 List RunProc (string sql, params object[] pamrs); 73 #endregion 74 } 75 }
2、然后实现IBaseRepository接口,在Wchl.WMBlog.Repository程序集中创建BaseRepository类来实现对数据操作的查询、增加、删除、编辑等。
BaseRepository类
1 namespace Wchl.WMBlog.Repository.Base 2 { 3 public class BaseRepository: IBaseRepository where TEntity:class 4 { 5 WMBlogDB db = new WMBlogDB(); 6 7 DbSet _dbSet; 8 9 public BaseRepository() 10 { 11 _dbSet = db.Set (); 12 } 13 14 #region 查询 15 /// 16 /// 单表查询 17 /// 18 /// 19 /// 20 public List QueryWhere(Expression bool>> predicate) 21 { 22 return _dbSet.Where(predicate).ToList(); 23 } 24 25 /// 26 /// 多表关联查询 27 /// 28 /// 29 /// 30 /// 31 public List QueryJoin(Expression bool>> predicate, string[] tableNames) 32 { 33 if (tableNames == null && tableNames.Any() == false) 34 { 35 throw new Exception("缺少连表名称"); 36 } 37 38 DbQuery query = _dbSet; 39 40 foreach (var table in tableNames) 41 { 42 query = query.Include(table); 43 } 44 45 return query.Where(predicate).ToList(); 46 } 47 48 /// 49 /// 升序查询还是降序查询 50 /// 51 /// 52 /// 53 /// 54 /// 55 /// 56 public List QueryOrderBy (Expression bool>> predicate, Expression > keySelector,bool IsQueryOrderBy) 57 { 58 if (IsQueryOrderBy) 59 { 60 return _dbSet.Where(predicate).OrderBy(keySelector).ToList(); 61 } 62 return _dbSet.Where(predicate).OrderByDescending(keySelector).ToList(); 63 64 } 65 66 /// 67 /// 升序分页查询还是降序分页 68 /// 69 /// 70 /// 第几页 71 /// 一页多少条 72 /// 返回共多少条 73 /// 查询条件 74 /// 排序字段 75 /// true为升序 false为降序 76 /// 77 public List QueryByPage (int pageIndex,int pagesize,out int rowcount,Expression bool>> predicate, Expression > keySelector, bool IsQueryOrderBy) 78 { 79 rowcount = _dbSet.Count(predicate); 80 if (IsQueryOrderBy) 81 { 82 return _dbSet.Where(predicate).OrderBy(keySelector).Skip((pageIndex - 1) * pagesize).Take(pagesize).ToList(); 83 } 84 else 85 { 86 return _dbSet.Where(predicate).OrderByDescending(keySelector).Skip((pageIndex - 1) * pagesize).Take(pagesize).ToList(); 87 } 88 } 89 #endregion 90 91 #region 编辑 92 /// 93 /// 通过传入的model加需要修改的字段来更改数据 94 /// 95 /// 96 /// 97 public void Edit(TEntity model, string[] propertys) 98 { 99 if (model == null) 100 { 101 throw new Exception("实体不能为空"); 102 } 103 104 if (propertys.Any() == false) 105 { 106 throw new Exception("要修改的属性至少要有一个"); 107 } 108 109 //将model追击到EF容器 110 DbEntityEntry entry = db.Entry(model); 111 112 entry.State = EntityState.Unchanged; 113 114 foreach (var item in propertys) 115 { 116 entry.Property(item).IsModified = true; 117 } 118 119 //关闭EF对于实体的合法性验证参数 120 db.Configuration.ValidateOnSaveEnabled = false; 121 } 122 123 /// 124 /// 直接查询之后再修改 125 /// 126 /// 127 public void Edit(TEntity model) 128 { 129 db.Entry(model).State = EntityState.Modified; 130 } 131 #endregion 132 133 #region 删除 134 public void Delete(TEntity model, bool isadded) 135 { 136 if (!isadded) { 137 _dbSet.Attach(model); 138 } 139 _dbSet.Remove(model); 140 } 141 #endregion 142 143 #region 新增 144 public void Add(TEntity model) 145 { 146 _dbSet.Add(model); 147 } 148 #endregion 149 150 #region 统一提交 151 public int SaverChanges() 152 { 153 return db.SaveChanges(); 154 } 155 #endregion 156 157 #region 调用存储过程返回一个指定的TResult 158 public List RunProc (string sql, params object[] pamrs) 159 { 160 return db.Database.SqlQuery (sql, pamrs).ToList(); 161 } 162 #endregion 163 } 164 }
三、业务逻辑层父接口和父类创建
1、在Wchl.WMBlog.IServices程序集中创建IBaseServices接口
IBaseServices接口:
1 namespace Wchl.WMBlog.IServices.Base 2 { 3 public interface IBaseServiceswhere TEntity:class 4 { 5 #region 查询 6 /// 7 /// 单表查询 8 /// 9 /// 10 /// 11 List QueryWhere(Expression bool>> predicate); 12 13 /// 14 /// 多表关联查询 15 /// 16 /// 17 /// 18 /// 19 List QueryJoin(Expression bool>> predicate, string[] tableNames); 20 /// 21 /// 升序查询还是降序查询 22 /// 23 /// 24 /// 25 /// 26 /// 27 /// 28 List QueryOrderBy (Expression bool>> predicate, Expression > keySelector, bool IsQueryOrderBy); 29 30 /// 31 /// 升序分页查询还是降序分页 32 /// 33 /// 34 /// 第几页 35 /// 一页多少条 36 /// 返回共多少条 37 /// 查询条件 38 /// 排序字段 39 /// true为升序 false为降序 40 /// 41 List QueryByPage (int pageIndex, int pagesize, out int rowcount, Expression bool>> predicate, Expression > keySelector, bool IsQueryOrderBy); 42 #endregion 43 44 #region 编辑 45 /// 46 /// 通过传入的model加需要修改的字段来更改数据 47 /// 48 /// 49 /// 50 void Edit(TEntity model, string[] propertys); 51 52 /// 53 /// 直接查询之后再修改 54 /// 55 /// 56 void Edit(TEntity model); 57 #endregion 58 59 #region 删除 60 void Delete(TEntity model, bool isadded); 61 #endregion 62 63 #region 新增 64 void Add(TEntity model); 65 #endregion 66 67 #region 统一提交 68 int SaverChanges(); 69 #endregion 70 71 #region 调用存储过程返回一个指定的TResult 72 List RunProc (string sql, params object[] pamrs); 73 #endregion 74 } 75 }
2、在Wchl.WMBlog.Services程序集创建BaseServices类
BaseServices类
1 namespace Wchl.WMBlog.Services.Base 2 { 3 public class BaseServices: IBaseServices where TEntity:class 4 { 5 public IBaseRepository baseDal = new BaseRepository (); 6 7 #region 查询 8 /// 9 /// 单表查询 10 /// 11 /// 12 /// 13 public List QueryWhere(Expression bool>> predicate) 14 { 15 return baseDal.QueryWhere(predicate); 16 } 17 18 /// 19 /// 多表关联查询 20 /// 21 /// 22 /// 23 /// 24 public List QueryJoin(Expression bool>> predicate, string[] tableNames) 25 { 26 return baseDal.QueryJoin(predicate, tableNames); 27 28 } 29 30 /// 31 /// 升序查询还是降序查询 32 /// 33 /// 34 /// 35 /// 36 /// 37 /// 38 public List QueryOrderBy (Expression bool>> predicate, Expression > keySelector, bool IsQueryOrderBy) 39 { 40 return baseDal.QueryOrderBy(predicate, keySelector, IsQueryOrderBy); 41 } 42 43 /// 44 /// 升序分页查询还是降序分页 45 /// 46 /// 47 /// 第几页 48 /// 一页多少条 49 /// 返回共多少条 50 /// 查询条件 51 /// 排序字段 52 /// true为升序 false为降序 53 /// 54 public List QueryByPage (int pageIndex, int pagesize, out int rowcount, Expression bool>> predicate, Expression > keySelector, bool IsQueryOrderBy) 55 { 56 57 return baseDal.QueryByPage(pageIndex, pagesize,out rowcount, predicate, keySelector, IsQueryOrderBy); 58 59 } 60 #endregion 61 62 #region 编辑 63 /// 64 /// 通过传入的model加需要修改的字段来更改数据 65 /// 66 /// 67 /// 68 public void Edit(TEntity model, string[] propertys) 69 { 70 baseDal.Edit(model, propertys); 71 } 72 73 /// 74 /// 直接查询之后再修改 75 /// 76 /// 77 public void Edit(TEntity model) 78 { 79 baseDal.Edit(model); 80 } 81 #endregion 82 83 #region 删除 84 public void Delete(TEntity model, bool isadded) 85 { 86 baseDal.Delete(model, isadded); 87 } 88 #endregion 89 90 #region 新增 91 public void Add(TEntity model) 92 { 93 baseDal.Add(model); 94 } 95 #endregion 96 97 #region 统一提交 98 public int SaverChanges() 99 { 100 return baseDal.SaverChanges(); 101 } 102 #endregion 103 104 #region 调用存储过程返回一个指定的TResult 105 public List RunProc (string sql, params object[] pamrs) 106 { 107 return baseDal.RunProc (sql, pamrs); 108 } 109 #endregion 110 } 111 }
到目前为止数据库、仓储层、业务逻辑层的父类和父接口都实现了,下一篇博文就在UI层怎么调用,测试看,成功写成功没。
谢谢大家的支持,多提宝贵意见。