• 从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑


    前言

         从上篇30岁找份程序员的工作(伪程序员的独白)文章开始,我说过我要用我自学的技术,来搭建一个博客系统,也希望大家给点意见,另外我很感谢博客园的各位朋友们,对我那篇算是自我阶段总结文章的评论,在里面能看出有很多种声音,有支持的我的朋友给我加油打气,有分享自己工作经历的朋友,有提出忠肯意见的朋友,有对记事本写代码吐槽的朋友,也有希望让我换个行业的,觉得我可能不适合这个行业朋友,不管怎样,我都接受,都是大家同行的一些忠告,谢谢大家。

         首先我要在这里感谢很多博客园里面的大牛,写了很多系列,很多学习资料,让我受益很多,有机会找个时间,我会把我浏览器中收藏的资源都整理出来,分享给大家,其实我会的这些都是自己在博客园看到的文章、在某宝买的视频、QQ群里看群主的分享公开课学的,希望大家多提宝贵意见。

    一、框架搭建

    image

    首先创建几个文件夹:

    01Data用来放链接数据的EF以及创建表的类;

    02Core存放数据仓储一些跟数据库链接实现数据操作的部分:

    03Services 用于存放业务逻辑处理;

    04Common用于放公共应用的工具之类;

    05UI mvc页面展示的就放在这里 以及web相关的核心代码

    其中除了Wchl.CRM.WebUI创建的是MVC5应用程序,其他的都是创建类库

    二、创建数据库

    1.创建一个空的EF code frist环境,输入的名字为WMBlogDB

    image

    2、选择空的Code Frist模型

    image

    3、创建一个models文件存放所有表的类,这里先创建一个用户信息表的类sysUserInfo

    sysUserInfo类:

      1 namespace Wchl.WMBlog.Model.Models
      2 {
      3      public class sysUserInfo
      4     {
      5         /// <summary>
      6         /// 用户ID
      7         /// </summary>
      8         public int uID { get; set; }
      9         /// <summary>
     10         /// 登录账号
     11         /// </summary>
     12         public string uLoginName { get; set; }
     13         /// <summary>
     14         /// 登录密码
     15         /// </summary>
     16         public string uLoginPWD { get; set; }
     17         /// <summary>
     18         /// 真实姓名
     19         /// </summary>
     20         public string uRealName { get; set; }
     21         /// <summary>
     22         /// 状态
     23         /// </summary>
     24         public int uStatus { get; set; }
     25         /// <summary>
     26         /// 备注
     27         /// </summary>
     28         public string uRemark { get; set; }
     29         /// <summary>
     30         /// 创建时间
     31         /// </summary>
     32         public System.DateTime uCreateTime { get; set; }
     33         /// <summary>
     34         /// 更新时间
     35         /// </summary>
     36         public System.DateTime uUpdateTime { get; set; }
     37     }
     38 }
    View Code

    4、创建一个maps文件夹,主要是用来放对表字段进行约束的类sysUserInfoMap

    sysUserInfoMap类:

      1 namespace Wchl.WMBlog.Model.Maps
      2 {
      3     public class sysUserInfoMap:EntityTypeConfiguration<sysUserInfo>
      4     {
      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 }
    View Code

    关于EntityTypeConfiguration类的用法,大家可以去看看博客园里面一些介绍文章,HasKey设置主键,HasMaxLength字段最大长度。

    5、在控制台中创建数据库脚本 Enable-Migrations

    image

    6、修改Configuration类配置

    image

    7、在WMBlogDB类中重写OnModelCreating方法

    image

    重写OnModelCreating方法:

      1         protected override void OnModelCreating(DbModelBuilder modelBuilder)
      2         {
      3             //移除表名为复数
      4             modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
      5             //自动添加实现EntityTypeConfiguration的类
      6             modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
      7             base.OnModelCreating(modelBuilder);
      8         }
    View Code

    二、仓储层建设

    1、在Wchl.WMBlog.IRepository中创建一个类,做为操作数据的父接口IBaseRepository,这里使用泛型来创建

    IBaseRepository接口

      1 namespace Wchl.WMBlog.IRepository.Base
      2 {
      3     public interface IBaseRepository<TEntity> where TEntity:class
      4     {
      5         #region 查询
      6         /// <summary>
      7         /// 单表查询
      8         /// </summary>
      9         /// <param name="predicate"></param>
     10         /// <returns></returns>
     11         List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> predicate);
     12 
     13         /// <summary>
     14         /// 多表关联查询
     15         /// </summary>
     16         /// <param name="predicate"></param>
     17         /// <param name="tableNames"></param>
     18         /// <returns></returns>
     19         List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> predicate, string[] tableNames);
     20         /// <summary>
     21         /// 升序查询还是降序查询
     22         /// </summary>
     23         /// <typeparam name="TKey"></typeparam>
     24         /// <param name="predicate"></param>
     25         /// <param name="keySelector"></param>
     26         /// <param name="IsQueryOrderBy"></param>
     27         /// <returns></returns>
     28         List<TEntity> QueryOrderBy<TKey>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy);
     29 
     30         /// <summary>
     31         /// 升序分页查询还是降序分页
     32         /// </summary>
     33         /// <typeparam name="TKey"></typeparam>
     34         /// <param name="pageIndex">第几页</param>
     35         /// <param name="pagesize">一页多少条</param>
     36         /// <param name="rowcount">返回共多少条</param>
     37         /// <param name="predicate">查询条件</param>
     38         /// <param name="keySelector">排序字段</param>
     39         /// <param name="IsQueryOrderBy">true为升序 false为降序</param>
     40         /// <returns></returns>
     41         List<TEntity> QueryByPage<TKey>(int pageIndex, int pagesize, out int rowcount, Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy);
     42         #endregion
     43 
     44         #region 编辑
     45         /// <summary>
     46         /// 通过传入的model加需要修改的字段来更改数据
     47         /// </summary>
     48         /// <param name="model"></param>
     49         /// <param name="propertys"></param>
     50         void Edit(TEntity model, string[] propertys);
     51 
     52         /// <summary>
     53         /// 直接查询之后再修改
     54         /// </summary>
     55         /// <param name="model"></param>
     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<TResult> RunProc<TResult>(string sql, params object[] pamrs);
     73         #endregion
     74     }
     75 }
    View Code

    2、然后实现IBaseRepository接口,在Wchl.WMBlog.Repository程序集中创建BaseRepository类来实现对数据操作的查询、增加、删除、编辑等。

    BaseRepository

      1 namespace Wchl.WMBlog.Repository.Base
      2 {
      3     public class BaseRepository<TEntity>: IBaseRepository<TEntity> where TEntity:class
      4     {
      5         WMBlogDB db = new WMBlogDB();
      6 
      7         DbSet<TEntity> _dbSet;
      8 
      9         public BaseRepository()
     10         {
     11             _dbSet = db.Set<TEntity>();
     12         }
     13 
     14         #region 查询
     15         /// <summary>
     16         /// 单表查询
     17         /// </summary>
     18         /// <param name="predicate"></param>
     19         /// <returns></returns>
     20         public List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> predicate)
     21         {
     22            return _dbSet.Where(predicate).ToList();
     23         }
     24 
     25         /// <summary>
     26         /// 多表关联查询
     27         /// </summary>
     28         /// <param name="predicate"></param>
     29         /// <param name="tableNames"></param>
     30         /// <returns></returns>
     31         public List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> predicate, string[] tableNames)
     32         {
     33             if (tableNames == null && tableNames.Any() == false)
     34             {
     35                 throw new Exception("缺少连表名称");
     36             }
     37 
     38             DbQuery<TEntity> 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         /// <summary>
     49         /// 升序查询还是降序查询
     50         /// </summary>
     51         /// <typeparam name="TKey"></typeparam>
     52         /// <param name="predicate"></param>
     53         /// <param name="keySelector"></param>
     54         /// <param name="IsQueryOrderBy"></param>
     55         /// <returns></returns>
     56         public List<TEntity> QueryOrderBy<TKey>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> 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         /// <summary>
     67         /// 升序分页查询还是降序分页
     68         /// </summary>
     69         /// <typeparam name="TKey"></typeparam>
     70         /// <param name="pageIndex">第几页</param>
     71         /// <param name="pagesize">一页多少条</param>
     72         /// <param name="rowcount">返回共多少条</param>
     73         /// <param name="predicate">查询条件</param>
     74         /// <param name="keySelector">排序字段</param>
     75         /// <param name="IsQueryOrderBy">true为升序 false为降序</param>
     76         /// <returns></returns>
     77         public List<TEntity> QueryByPage<TKey>(int pageIndex,int pagesize,out int rowcount,Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> 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         /// <summary>
     93         /// 通过传入的model加需要修改的字段来更改数据
     94         /// </summary>
     95         /// <param name="model"></param>
     96         /// <param name="propertys"></param>
     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         /// <summary>
    124         /// 直接查询之后再修改
    125         /// </summary>
    126         /// <param name="model"></param>
    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<TResult> RunProc<TResult>(string sql, params object[] pamrs)
    159         {
    160             return db.Database.SqlQuery<TResult>(sql, pamrs).ToList();
    161         }
    162         #endregion
    163     }
    164 }
    View Code

    三、业务逻辑层父接口和父类创建

    1、在Wchl.WMBlog.IServices程序集中创建IBaseServices接口

    IBaseServices接口:

      1 namespace Wchl.WMBlog.IServices.Base
      2 {
      3     public interface IBaseServices<TEntity> where TEntity:class
      4     {
      5         #region 查询
      6         /// <summary>
      7         /// 单表查询
      8         /// </summary>
      9         /// <param name="predicate"></param>
     10         /// <returns></returns>
     11         List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> predicate);
     12 
     13         /// <summary>
     14         /// 多表关联查询
     15         /// </summary>
     16         /// <param name="predicate"></param>
     17         /// <param name="tableNames"></param>
     18         /// <returns></returns>
     19         List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> predicate, string[] tableNames);
     20         /// <summary>
     21         /// 升序查询还是降序查询
     22         /// </summary>
     23         /// <typeparam name="TKey"></typeparam>
     24         /// <param name="predicate"></param>
     25         /// <param name="keySelector"></param>
     26         /// <param name="IsQueryOrderBy"></param>
     27         /// <returns></returns>
     28         List<TEntity> QueryOrderBy<TKey>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy);
     29 
     30         /// <summary>
     31         /// 升序分页查询还是降序分页
     32         /// </summary>
     33         /// <typeparam name="TKey"></typeparam>
     34         /// <param name="pageIndex">第几页</param>
     35         /// <param name="pagesize">一页多少条</param>
     36         /// <param name="rowcount">返回共多少条</param>
     37         /// <param name="predicate">查询条件</param>
     38         /// <param name="keySelector">排序字段</param>
     39         /// <param name="IsQueryOrderBy">true为升序 false为降序</param>
     40         /// <returns></returns>
     41         List<TEntity> QueryByPage<TKey>(int pageIndex, int pagesize, out int rowcount, Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy);
     42         #endregion
     43 
     44         #region 编辑
     45         /// <summary>
     46         /// 通过传入的model加需要修改的字段来更改数据
     47         /// </summary>
     48         /// <param name="model"></param>
     49         /// <param name="propertys"></param>
     50         void Edit(TEntity model, string[] propertys);
     51 
     52         /// <summary>
     53         /// 直接查询之后再修改
     54         /// </summary>
     55         /// <param name="model"></param>
     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<TResult> RunProc<TResult>(string sql, params object[] pamrs);
     73         #endregion
     74     }
     75 }
    View Code

    2、在Wchl.WMBlog.Services程序集创建BaseServices类

    BaseServices类

      1 namespace Wchl.WMBlog.Services.Base
      2 {
      3    public class BaseServices<TEntity>: IBaseServices<TEntity> where TEntity:class
      4     {
      5         public IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>();
      6 
      7         #region 查询
      8         /// <summary>
      9         /// 单表查询
     10         /// </summary>
     11         /// <param name="predicate"></param>
     12         /// <returns></returns>
     13         public List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> predicate)
     14         {
     15             return baseDal.QueryWhere(predicate);
     16         }
     17 
     18         /// <summary>
     19         /// 多表关联查询
     20         /// </summary>
     21         /// <param name="predicate"></param>
     22         /// <param name="tableNames"></param>
     23         /// <returns></returns>
     24         public List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> predicate, string[] tableNames)
     25         {
     26             return baseDal.QueryJoin(predicate, tableNames);
     27 
     28         }
     29 
     30         /// <summary>
     31         /// 升序查询还是降序查询
     32         /// </summary>
     33         /// <typeparam name="TKey"></typeparam>
     34         /// <param name="predicate"></param>
     35         /// <param name="keySelector"></param>
     36         /// <param name="IsQueryOrderBy"></param>
     37         /// <returns></returns>
     38         public List<TEntity> QueryOrderBy<TKey>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy)
     39         {
     40             return baseDal.QueryOrderBy(predicate, keySelector, IsQueryOrderBy);
     41         }
     42 
     43         /// <summary>
     44         /// 升序分页查询还是降序分页
     45         /// </summary>
     46         /// <typeparam name="TKey"></typeparam>
     47         /// <param name="pageIndex">第几页</param>
     48         /// <param name="pagesize">一页多少条</param>
     49         /// <param name="rowcount">返回共多少条</param>
     50         /// <param name="predicate">查询条件</param>
     51         /// <param name="keySelector">排序字段</param>
     52         /// <param name="IsQueryOrderBy">true为升序 false为降序</param>
     53         /// <returns></returns>
     54         public List<TEntity> QueryByPage<TKey>(int pageIndex, int pagesize, out int rowcount, Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy)
     55         {
     56 
     57             return baseDal.QueryByPage(pageIndex, pagesize,out rowcount, predicate, keySelector, IsQueryOrderBy);
     58 
     59         }
     60         #endregion
     61 
     62         #region 编辑
     63         /// <summary>
     64         /// 通过传入的model加需要修改的字段来更改数据
     65         /// </summary>
     66         /// <param name="model"></param>
     67         /// <param name="propertys"></param>
     68         public void Edit(TEntity model, string[] propertys)
     69         {
     70             baseDal.Edit(model, propertys);
     71         }
     72 
     73         /// <summary>
     74         /// 直接查询之后再修改
     75         /// </summary>
     76         /// <param name="model"></param>
     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<TResult> RunProc<TResult>(string sql, params object[] pamrs)
    106         {
    107            return baseDal.RunProc<TResult>(sql, pamrs);
    108         }
    109         #endregion
    110     }
    111 }
    View Code

       到目前为止数据库、仓储层、业务逻辑层的父类和父接口都实现了,下一篇博文就在UI层怎么调用,测试看,成功写成功没。

    谢谢大家的支持,多提宝贵意见。

  • 相关阅读:
    【个人笔记】MySQL聚合函数、子查询
    artTemplate的使用总结
    【学习笔记】node.js入门基础
    【知了堂学习笔记】SQL查询基础语句(单表查询、多表查询)
    浅谈java final关键字
    3D魔幻旋转
    3分钟实现星空图
    深入浅出,谈谈面向对象几大特征
    html,css常用标签
    java中常用集合的理解
  • 原文地址:https://www.cnblogs.com/M-LittleBird/p/5897509.html
Copyright © 2020-2023  润新知