【干货】利用MVC5+EF6搭建博客系统(一)EF Code frist、实现泛型数据仓储以及业务逻辑
习MVC有一段时间了,决定自己写一套Demo了,写完源码再共享。
PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可。
一、框架搭建
二、创建数据库
1.创建一个空的EF code frist环境,输入的名字为52MVCBlogDB
2、选择空的Code Frist模型
3、创建一个Models文件存放所有表的类,这里先创建一个用户信息表的类sysUserInfo
sysUserInfo类:
class sysUserInfo
{
/// <summary>
/// 用户ID
/// </summary>
public int uID { get; set; }
/// <summary>
/// 登录账号
/// </summary>
public string uLoginName { get; set; }
/// <summary>
/// 登录密码
/// </summary>
public string uLoginPWD { get; set; }
/// <summary>
/// 真实姓名
/// </summary>
public string uRealName { get; set; }
/// <summary>
/// 状态
/// </summary>
public int uStatus { get; set; }
/// <summary>
/// 备注
/// </summary>
public string uRemark { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public System.DateTime uCreateTime { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public System.DateTime uUpdateTime { get; set; }
}
4、创建一个Maps文件夹,主要是用来放对表字段进行约束的类sysUserInfoMap
sysUserInfoMap类:
namespace _52MVCBlog.Model.Maps
{
public class sysUserInfoMap : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<sysUserInfo>
{
public sysUserInfoMap()
{
this.HasKey(u => u.uID);
this.Property(u => u.uLoginName).HasMaxLength();
this.Property(u => u.uLoginPWD).HasMaxLength();
this.Property(u => u.uRealName).HasMaxLength();
}
}
}
5、在控制台中创建数据库脚本 Enable-Migrations(这里没有修改App.config里面的数据库连接串,使用的是默认的数据库)
6、修改Configuration类配置
7、在_52MVCBlogDB类中重写OnModelCreating方法
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//移除表名为复数
modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
//此方法可以将当前程序集下所有继承了ComplexTypeConfiguration、EntityTypeConfiguration类型的类添加到注册器
//自动添加实现EntityTypeConfiguration的类(不再需要public virtual DbSet<MyEntity> MyEntities { get; set; })
modelBuilder.Configurations.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly());
base.OnModelCreating(modelBuilder);
}
二、仓储层建设
1、在52MVCBlog.IRepository中创建一个类,做为操作数据的父接口IBaseRepository,这里使用泛型来创建
IBaseRepository接口代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks; namespace _52MVCBlog.IRepository.Base
{
public interface IBaseRepository<TEntity> where TEntity : class
{
#region 查询
/// <summary>
/// 单表查询
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> predicate); /// <summary>
/// 多表关联查询
/// </summary>
/// <param name="predicate"></param>
/// <param name="tableNames"></param>
/// <returns></returns>
List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> predicate, string[] tableNames);
/// <summary>
/// 升序查询还是降序查询
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="predicate"></param>
/// <param name="keySelector"></param>
/// <param name="IsQueryOrderBy"></param>
/// <returns></returns>
List<TEntity> QueryOrderBy<TKey>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy); /// <summary>
/// 升序分页查询还是降序分页
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="pageIndex">第几页</param>
/// <param name="pagesize">一页多少条</param>
/// <param name="rowcount">返回共多少条</param>
/// <param name="predicate">查询条件</param>
/// <param name="keySelector">排序字段</param>
/// <param name="IsQueryOrderBy">true为升序 false为降序</param>
/// <returns></returns>
List<TEntity> QueryByPage<TKey>(int pageIndex, int pagesize, out int rowcount, Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy);
#endregion #region 编辑
/// <summary>
/// 通过传入的model加需要修改的字段来更改数据
/// </summary>
/// <param name="model"></param>
/// <param name="propertys"></param>
void Edit(TEntity model, string[] propertys); /// <summary>
/// 直接查询之后再修改
/// </summary>
/// <param name="model"></param>
void Edit(TEntity model);
#endregion #region 删除
void Delete(TEntity model, bool isadded);
#endregion #region 新增
void Add(TEntity model);
#endregion #region 统一提交
int SaverChanges();
#endregion #region 调用存储过程返回一个指定的TResult
List<TResult> RunProc<TResult>(string sql, params object[] pamrs);
#endregion
}
}
2、然后实现IBaseRepository接口,在52MVCBlog.Repository程序集中创建BaseRepository类来实现对数据操作的查询、增加、删除、编辑等。
BaseRepository代码:
using _52MVCBlog.IRepository.Base;
using _52MVCBlog.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks; namespace _52MVCBlog.Repository.Base
{
public class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : class
{
_52MVCBlogDB db = new _52MVCBlogDB(); DbSet<TEntity> _dbSet; public BaseRepository()
{
_dbSet = db.Set<TEntity>();
} #region 查询
/// <summary>
/// 单表查询
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> predicate)
{
return _dbSet.Where(predicate).ToList();
} /// <summary>
/// 多表关联查询
/// </summary>
/// <param name="predicate"></param>
/// <param name="tableNames"></param>
/// <returns></returns>
public List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> predicate, string[] tableNames)
{
if (tableNames == null && tableNames.Any() == false)
{
throw new Exception("缺少连表名称");
} //DbSet继承DbQuery;DbSet;表示上下文中给定类型的所有实体的集合或可从数据库中查询的给定类型的所有实体的集合。DbQuery表示针对 DbContext 的非泛型 LINQ to Entities 查询。
DbQuery<TEntity> query = _dbSet; foreach (var table in tableNames)
{
query = query.Include(table);
}
return query.Where(predicate).ToList();
} /// <summary>
/// 升序查询还是降序查询
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="predicate"></param>
/// <param name="keySelector"></param>
/// <param name="IsQueryOrderBy"></param>
/// <returns></returns>
public List<TEntity> QueryOrderBy<TKey>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy)
{
if (IsQueryOrderBy)
return _dbSet.Where(predicate).OrderBy(keySelector).ToList();
else
return _dbSet.Where(predicate).OrderByDescending(keySelector).ToList();
} /// <summary>
/// 升序分页查询还是降序分页
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="pageIndex">第几页</param>
/// <param name="pagesize">一页多少条</param>
/// <param name="rowcount">返回共多少条</param>
/// <param name="predicate">查询条件</param>
/// <param name="keySelector">排序字段</param>
/// <param name="IsQueryOrderBy">true为升序 false为降序</param>
/// <returns></returns>
public List<TEntity> QueryByPage<TKey>(int pageIndex, int pagesize, out int rowcount, Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy)
{
rowcount = _dbSet.Count(predicate);
if (IsQueryOrderBy)
return _dbSet.Where(predicate).OrderBy(keySelector).Skip((pageIndex - ) * pagesize).Take(pagesize).ToList();
else
return _dbSet.Where(predicate).OrderByDescending(keySelector).Skip((pageIndex - ) * pagesize).Take(pagesize).ToList();
}
#endregion #region 编辑
/// <summary>
/// 通过传入的model加需要修改的字段来更改数据
/// </summary>
/// <param name="model"></param>
/// <param name="propertys"></param>
public void Edit(TEntity model, string[] propertys)
{
if (model == null)
throw new Exception("实体不能为空");
if(!propertys.Any())
throw new Exception("要修改的属性至少要有一个"); //将model追击到EF容器
DbEntityEntry entry= db.Entry(model);
entry.State = EntityState.Unchanged; foreach (var item in propertys)
{
entry.Property(item).IsModified=true;
} //关闭EF对于实体的合法性验证参数
db.Configuration.ValidateOnSaveEnabled = false;
} /// <summary>
/// 直接查询之后再修改
/// </summary>
/// <param name="model"></param>
public void Edit(TEntity model)
{
db.Entry(model).State = EntityState.Modified;
}
#endregion #region 删除
public void Delete(TEntity model, bool isadded)
{
if (!isadded)
{
_dbSet.Attach(model);
}
_dbSet.Remove(model);
}
#endregion #region 新增
public void Add(TEntity model)
{
_dbSet.Add(model);
}
#endregion #region 统一提交
public int SaverChanges()
{
return db.SaveChanges();
}
#endregion #region 调用存储过程返回一个指定的TResult
public List<TResult> RunProc<TResult>(string sql, params object[] pamrs)
{
return db.Database.SqlQuery<TResult>(sql, pamrs).ToList();
}
#endregion
}
}
三、业务逻辑层父接口和父类创建
1、在52MVCBlog.IService程序集中创建IBaseServices接口
IBaseServices接口代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks; namespace _52MVCBlog.IService.Base
{
public interface IBaseServices<TEntity> where TEntity : class
{
#region 查询
/// <summary>
/// 单表查询
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> predicate); /// <summary>
/// 多表关联查询
/// </summary>
/// <param name="predicate"></param>
/// <param name="tableNames"></param>
/// <returns></returns>
List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> predicate, string[] tableNames);
/// <summary>
/// 升序查询还是降序查询
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="predicate"></param>
/// <param name="keySelector"></param>
/// <param name="IsQueryOrderBy"></param>
/// <returns></returns>
List<TEntity> QueryOrderBy<TKey>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy); /// <summary>
/// 升序分页查询还是降序分页
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="pageIndex">第几页</param>
/// <param name="pagesize">一页多少条</param>
/// <param name="rowcount">返回共多少条</param>
/// <param name="predicate">查询条件</param>
/// <param name="keySelector">排序字段</param>
/// <param name="IsQueryOrderBy">true为升序 false为降序</param>
/// <returns></returns>
List<TEntity> QueryByPage<TKey>(int pageIndex, int pagesize, out int rowcount, Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy);
#endregion #region 编辑
/// <summary>
/// 通过传入的model加需要修改的字段来更改数据
/// </summary>
/// <param name="model"></param>
/// <param name="propertys"></param>
void Edit(TEntity model, string[] propertys); /// <summary>
/// 直接查询之后再修改
/// </summary>
/// <param name="model"></param>
void Edit(TEntity model);
#endregion #region 删除
void Delete(TEntity model, bool isadded);
#endregion #region 新增
void Add(TEntity model);
#endregion #region 统一提交
int SaverChanges();
#endregion #region 调用存储过程返回一个指定的TResult
List<TResult> RunProc<TResult>(string sql, params object[] pamrs);
#endregion
}
}
2、在52MVCBlog.Service程序集创建BaseServices类
using _52MVCBlog.IRepository.Base;
using _52MVCBlog.IService.Base;
using _52MVCBlog.Repository.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks; namespace _52MVCBlog.Service.Base
{
public class BaseServices<TEntity> : IBaseServices<TEntity> where TEntity : class
{
private IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>(); #region 查询
/// <summary>
/// 单表查询
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
public List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> predicate)
{
return baseDal.QueryWhere(predicate);
} /// <summary>
/// 多表关联查询
/// </summary>
/// <param name="predicate"></param>
/// <param name="tableNames"></param>
/// <returns></returns>
public List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> predicate, string[] tableNames)
{
return baseDal.QueryJoin(predicate, tableNames); } /// <summary>
/// 升序查询还是降序查询
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="predicate"></param>
/// <param name="keySelector"></param>
/// <param name="IsQueryOrderBy"></param>
/// <returns></returns>
public List<TEntity> QueryOrderBy<TKey>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy)
{
return baseDal.QueryOrderBy(predicate, keySelector, IsQueryOrderBy);
} /// <summary>
/// 升序分页查询还是降序分页
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="pageIndex">第几页</param>
/// <param name="pagesize">一页多少条</param>
/// <param name="rowcount">返回共多少条</param>
/// <param name="predicate">查询条件</param>
/// <param name="keySelector">排序字段</param>
/// <param name="IsQueryOrderBy">true为升序 false为降序</param>
/// <returns></returns>
public List<TEntity> QueryByPage<TKey>(int pageIndex, int pagesize, out int rowcount, Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TKey>> keySelector, bool IsQueryOrderBy)
{ return baseDal.QueryByPage(pageIndex, pagesize, out rowcount, predicate, keySelector, IsQueryOrderBy); }
#endregion #region 编辑
/// <summary>
/// 通过传入的model加需要修改的字段来更改数据
/// </summary>
/// <param name="model"></param>
/// <param name="propertys"></param>
public void Edit(TEntity model, string[] propertys)
{
baseDal.Edit(model, propertys);
} /// <summary>
/// 直接查询之后再修改
/// </summary>
/// <param name="model"></param>
public void Edit(TEntity model)
{
baseDal.Edit(model);
}
#endregion #region 删除
public void Delete(TEntity model, bool isadded)
{
baseDal.Delete(model, isadded);
}
#endregion #region 新增
public void Add(TEntity model)
{
baseDal.Add(model);
}
#endregion #region 统一提交
public int SaverChanges()
{
return baseDal.SaverChanges();
}
#endregion #region 调用存储过程返回一个指定的TResult
public List<TResult> RunProc<TResult>(string sql, params object[] pamrs)
{
return baseDal.RunProc<TResult>(sql, pamrs);
}
#endregion
}
}
到目前为止数据库、仓储层、业务逻辑层的父类和父接口都实现了,下一篇博文就在UI层怎么调用
【干货】利用MVC5+EF6搭建博客系统(一)EF Code frist、实现泛型数据仓储以及业务逻辑的更多相关文章
- 【干货】利用MVC5+EF6搭建博客系统(四)(上)前后台页面布局页面实现,介绍使用的UI框架以及JS组件
一.博客系统进度回顾以及页面设计 1.1页面设计说明 紧接前面基础基本完成了框架搭建,现在开始设计页面,前台页面设计我是模仿我博客园的风格来设计的,后台是常规的左右布局风格. 1.2前台页面风格 主页 ...
- 【干货】利用MVC5+EF6搭建博客系统(四)(下)前后台布局实现、发布博客以及展示
二.博客系统后台布局实现 2.1.这里所用的是MVC的布局页来实现的,后台主要分为三部分:导航.菜单.主要内容 代码实现: 这里把后台单独放在一个区域里面,所以我这里建立一个admin的区域 在布局页 ...
- 【干货】利用MVC5+EF6搭建博客系统(三)添加Nlog日志、缓存机制(MemoryCache、RedisCache)、创建控制器父类BaseController
PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.回顾系统进度以及本章概要 目前博客系统已经数据库创建.以及依赖注入Autofac集成,接下来就是日志和缓存集成,这里日志用的是N ...
- 【干货】利用MVC5+EF6搭建博客系统(二)测试添加数据、集成Autofac依赖注入
PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.测试仓储层.业务层是否能实现对数据库表的操作 1.在52MVCBlog.IRepository程序集下创建IsysUserInf ...
- 利用MVC5+EF6搭建博客系统
https://www.cnblogs.com/wyt007/p/7880137.html
- 从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑
前言 从上篇30岁找份程序员的工作(伪程序员的独白),文章开始,我说过我要用我自学的技术,来搭建一个博客系统,也希望大家给点意见,另外我很感谢博客园的各位朋友们,对我那篇算是自我阶段总结文章 ...
- Django快速搭建博客系统
Django快速搭建博客系统 一.开发环境 Windows 7(64bit) python 3.6 https://www.python.org/ Django 2.0 https://www. ...
- day14搭建博客系统项目
day14搭建博客系统项目 1.下载代码包 [root@web02 opt]# git clone https://gitee.com/lylinux/DjangoBlog.git 2.使用pid安装 ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(4)上,前后台页面布局页面实现,介绍使用的UI框架以及JS组件
一.博客系统进度回顾以及页面设计 1.1页面设计说明 紧接前面基础基本完成了框架搭建,现在开始设计页面,前台页面设计我是模仿我博客园的风格来设计的,后台是常规的左右布局风格. 1.2前台页面风格 主页 ...
随机推荐
- 关于canvas补充说明
上篇文章提到的canvas画布,用到f2组件,组件地址https://gw.alipayobjects.com/os/antv/assets/f2/3.0.0/f2.js或利用npm下载:npm in ...
- 解决使用Mybatis 传入多参数使用map封装遇到的 “坑”问题
好久没来写些东西了,今天 我分享一下自己遇到的一个“小 坑”,这也许对您来说不是个问题,但是我还是希望对没有遇到过这类问题的朋友给个小小的帮助吧 是这样的,需求:需要实现根据多条件 且分页展示数据 1 ...
- 探索微信小程序之路
记录一下每日的知识点,时不时温习一下. 视图与渲染对于页面中的数据,以json的方式存放在js文件的data中 判断的使用: <view wx:if='{{true}}'> 为真时显示 & ...
- 检测MySQL主从备份是否运行
通过查看 slave 状态,确保 Slave_IO_Running: Yes Slave_SQL_Running: Yes #!/bin/bash#Author:Darius-Dmysql -uro ...
- Redis Sentinel 配置文件
基础参考:https://www.cnblogs.com/wang-li/p/9955303.html 配置文件讲解 1.sentinel monitor # sentinel monitor < ...
- 1.3if判断语句+while和for循环语句+购物车作业
1.if 语句 if userame=_usename and password=_password: print("welcome user {name} login..."). ...
- 查询树节点、oracle、select...start with...connect by prior...
通过子节点向根节点追朔. select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid 通过根节 ...
- 计算机网络九:IP地址、子网掩码、默认网关、DHCP服务器、DNS服务器、WINS服务器
一.IP地址与子网掩码 1.IP地址 ipv4下,ip地址=网络号+主机号. 2.子网掩码 子网掩码(subnet mask)又叫网络掩码.地址掩码.子网络遮罩,它是一种用来指明一个I ...
- Python Moment.js api
moment.js(js date)日期格式化处理插件强大,官方网站:http://momentjs.com/你也可以查看官方网站E文原版moment.js api.当前日期格式化 moment(). ...
- vue computed计算属性和watch监听属性解疑答惑
computed计算属性 计算属性类似于方法,用于输出data中定义的属性数据的结果,data数据变化时,计算属性的结果会同步变化,需要注意的是计算属性不可与data定义的属性同名. 相比于方 ...