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

前言

     从上篇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         /// <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 }

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 }

关于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<PluralizingTableNameConvention>();
  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 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 }

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 }

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

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 }

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 }

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

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

时间: 2024-10-26 17:39:50

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

从零开始,搭建博客系统MVC5+EF6搭建框架(4)上,前后台页面布局页面实现,介绍使用的UI框架以及JS组件

一.博客系统进度回顾以及页面设计 1.1页面设计说明 紧接前面基础基本完成了框架搭建,现在开始设计页面,前台页面设计我是模仿我博客园的风格来设计的,后台是常规的左右布局风格. 1.2前台页面风格 主页面: 技术博客风格: 详情页风格: 详情页留言风格: 1.3后台风格: 表格风格: 博客发布风格: 以上看到的系统页面是目前系统完成的风格,以后页面设计都参考这些页面风格. 二.使用前端web框架以及插件说明 2.1选择前端web框架,我找了很多框架,以前学过自学过bootstrap觉得对于没有前端

从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文

一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效果 2.2实现控制器在前台控制器中创建一个Blog的控制器,主要是展示博客分类以及详情页 Action详情页实现: 1 /// <summary> 2 /// 详情页 3 /// </summary> 4 /// <param name="id"><

从零开始,搭建博客系统MVC5+EF6搭建框架(3),添加Nlog日志、缓存机制(MemoryCache、RedisCache)、创建控制器父类BaseController

一.回顾系统进度以及本章概要 目前博客系统已经数据库创建.以及依赖注入Autofac集成,接下来就是日志和缓存集成,这里日志用的是Nlog,其实还有其他的日志框架如log4,这些博客园都有很多介绍,这里就不说了,缓存机制用的是微软自带的MemoryCache和比较流行Redis,这里我也只是了解使用,没有做更升入的研究,以后好好学一下Redis,然后就是实现一个BaseController父类用来重写JsonResult方法为的是返回时间格式问题,默认json返回的时间格式是Date(84923

从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入

一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 1 namespace Wchl.WMBlog.IRepository 2 { 3 public partial interface IsysUserInfoRepository : IBaseRepository<sysUserInfo> 4 { 5 6 } 7 } 2.创建sysUserInfoRepository类继承BaseReposit

使用ASP.NET MVC+Entity Framework快速搭建博客系统

学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和分享. 首先,得确定需求,木有需求的话,那还搞个毛线呀!嗯--大致思考了一下,终于得出如下需求: 1.能自定义分类 2.能发文章 OK!就这样,先从简单的开始(其实是复杂的不会做),后面有需要再添加(希望水平能达到).功能确定了,那么改确定要做成什么样子的了.先和度娘商量一下先-- 终于在我的淫威之下,度娘交出了一个比较简洁的,源网站在这里(表示感谢),被小弟阉割了之后效果如下图: 接下来就开始编码了么?嗯

使用EC2,VPC搭建博客系统详细步骤-1

1搭建 Amazon Virtual Private Cloud (Amazon VPC) 1.1搭建步骤: 1.1.1创建VPC 1.1.2子网 1.1.3路由表 1.1.4Internet网关 1.1.5DHCP选项集 1.1.6NAT网关 1.1.7ACL和安全组 2启动EC2实例,选择合适的AMI等等. 3在 Amazon Linux 2 上安装 LAMP Web 服务器 3.1安装步骤: 3.1.1远程(CRT使用*.pub) 3.1.2安装 Amazon Linux Extras和P

用php搭建博客系统-待续

PHP(全名:PHP: Hypertext Preprocessor)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域.PHP 独特的语法混合了C.Java.Perl以及PHP自创的语法.它可以比CGI或者Perl更快速地执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多:PHP还可以执行编译后代码,编译可

django 搭建博客系统之创建博客的数据库模型

在我们之前已经创建好了虚拟环境,以及开始一个项目. 现在我们要添加一些功能性代码,django鼓励我们把自己编写的代码放入app中,每个app实现一个功能. 如今新建一个blog app 1,在虚拟环境下进入根目录,运行 python manage.py startapp blog.就建立了一个名为blog的应用,app. 2,在setting.py 中'告诉'django 存在这样的一个app. 好了 我们已经有了blog这个app,是要实现博客文章,博客的文章应该含有标题.正文.作者.发表时

MVC5+EF6+BootStrap3.3.5 博客系统之项目搭建(一)

环境:vs2013,sql2008R2 引用版本:MVC5,EF6,BootStrap3.3.5 在之前一直都是webfrom开发,虽然开发简单:但是有很多不足的地方.在之前开发都是webfrom+MVC三层架构+数据库等等 我在想将MVC5,EF6,BootStrap3.3.5,结合融于之前的开发模式之中. 1.新建解决方案 2.新建控制台应用程序 Blog.MVC.EF.BootStrap.DAL,主要用于EF数据处理 3.新建3个类库 Blog.MVC.EF.BootStrap.Model