. 爱留图网站诞生html
. git源码:https://github.com/shenniubuxing3/LovePicture.Webgit
. AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型github
. AspNetCore-MVC实战系列(二)之经过绑定邮箱找回密码web
. AspNetCore-MVC实战系列(三)之我的中心sql
. AspNetCore-MVC实战系列(四)之帐户设置数据库
本章开篇先简单介绍下最近两周本身利用业余时间作的一个图片收集网站,固然这个是靠用户本身上传来收集不是去抓某些个网站的图片,那样没意义,这里我取名为“爱留图”;该网站的简单介绍你们能够参考下上篇的内容爱留图的诞生,这里打算经过一些列的博客讲解如何一步步利用aspnetcore的mvc来开发,但愿你们可以喜欢;json
首先,咋们须要在sqlserver中建立一张用户表To_UserInfo,这里我尽可能简单取一些属性做为字段,如下是表结构SQL:mvc
USE [LovePicture.Db] GO /****** Object: Table [dbo].[To_UserInfo] Script Date: 2017/4/25 17:30:53 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[To_UserInfo]( [Id] [int] IDENTITY(1,1) NOT NULL, [UserName] [nvarchar](50) NOT NULL, [UserPwd] [nvarchar](50) NOT NULL, [Email] [nvarchar](50) NULL, [NickName] [nvarchar](20) NULL, [Tel] [nvarchar](20) NULL, [Sex] [bit] NOT NULL, [Introduce] [nvarchar](200) NULL, [HeadPhoto] [nvarchar](200) NULL, [Birthday] [nvarchar](20) NULL, [Addr] [nvarchar](200) NULL, [Blog] [nvarchar](200) NULL, [Status] [int] NOT NULL, [CreateTime] [datetime] NOT NULL, [LoginTime] [datetime] NULL, [Ips] [nvarchar](50) NULL, [LevelNum] [int] NOT NULL, CONSTRAINT [PK_To_UserInfo] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
字段的意思没必要太明了,主要是学习怎么生成实体;先建立一个类库LovePicture.Model,因为这里我打算使用EF Core(全名:entity framework core),所以须要对这个类库安装相应的nuget包:app
Microsoft.EntityFrameworkCore.Design 框架
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design
注意啦是4个包,netcore官网给出的只有后面3个包没有第一个,有实际经验得出若是你不添加第一个包,那么由数据库来生成实体模型的时候会提示错误,这里我就不截图错误信息了有兴趣的朋友可尝试;来到这里咋们还须要经过vs控制台输入执行命令:
Scaffold-DbContext "Server=127.0.0.1,1431;User Id=sa;Password=123123;Database=LovePicture.Db;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
简单说下参数吧:
. Scaffold-DbContext:执行命令
. Server=...:数据库连接字符串
. -OutputDir Models:输出实体到名称为Models的文件夹中
我的领悟的注意事项:
vs2017可能存在的一个问题,当第一次须要在新建立的类库中使用反向工程生成实体模型的时候,若是您不设置该类库为起始项目,那会提示错误无法生成成功的;我遇到的时候用了不少方式尝试解决问题,甚至觉得什么东西安错了,结果在Git的问题中心找到了相关问题的回答,仅仅只须要设置下启动项就能解决,真实让我吃惊呢。
到这里若是你按照以上我列举的步骤操做,应该不会出现太大的问题可以经过sqserver数据库生成实体成功,固然不保证其余特殊的状况吧;
首先,经过vs2017建立个Aspnetcore的Mvc项目我取名为LovePicture.Web,咱们要了解的是netcore项目基本上都是经过nuget包来引入其余组件,可是强大的vs可以让咱们直接经过:右键web项目的“依赖项”-》添加引用-》解决方案-》选择其余项目的名称,以此来添加对其余项目的依赖(主要是新的vs版本因此废话一下);
有了依赖关系咱们先来改造一下经过反向工程生成的DbContext代码来知足咱们在Web中Mvc的使用;打开模型类库中的LovePicture_DbContext.cs文件,可以看到咱们比较熟悉相似于其余EF框架版本的结构,这里咱们只须要自动生成的LovePicture_DbContext构造函数删除掉,而后从新添加一个这样的构造函数:
1 public LovePicture_DbContext(DbContextOptions<LovePicture_DbContext> options) : base(options) { }
这样就能吧DbContext当作注入服务提供给引入这个类库的项目使用了,咱们也仅仅只须要在Web项目中的Startup.cs文件的ConfigureServices方法中添加依赖注入便可:
1 //添加数据库上下文 2 services.AddDbContext<LovePicture_DbContext>(b => 3 { 4 5 var dbLink = Configuration.GetSection("MoSelfSetting:DbLink").Value; 6 if (string.IsNullOrWhiteSpace(dbLink)) { throw new Exception("未找到数据库连接。"); } 7 8 b.UseSqlServer(dbLink); 9 10 });
这里因为连接数据库的话须要有一个链接串,这里经过DbContextOptionsBuilder的UseSqlServer扩展方法来传递,字符串的来源这里我配置在appsettings.json配置文件中的,所以可以很方便的经过 Configuration.GetSection("MoSelfSetting:DbLink").Value 来读取出配置文件中配置的链接串,固然若是能够你也能够直接在这里吧链接串写死都行,这里截图展现下配置文件的层级关系:
好了有了以上的配置,咋们就可以在MVC的Controller中很好的使用DbContext了,这里经过构造函数注入的方式使用:
1 private readonly LovePicture_DbContext _db; 2 public HomeController(LovePicture_DbContext db) 3 { 4 _db = db; 5 }
到这里Controller中就可以使用DbContext了,咱们能够在Action中直接经过各类EF的操做方法来对数据库执行读写命令;
由于后面文章内容涉及到用户上传头像等信息,因此须要一些可配置的信息(如:上传路径,连接字符串),因此这里须要有读取咱们自定义配置节点信息的操做;这里使用现成的appsettings.json文件来配置信息,这里个人配置内容如:
1 { 2 "Logging": { 3 "IncludeScopes": false, 4 "LogLevel": { 5 "Default": "Warning" 6 } 7 }, 8 "MoSelfSetting": { 9 //图片内容路径 10 "UpHeadPhotoPath": "D:\\F\\学习\\vs2017\\netcore\\LovePicture.Web\\wwwroot\\upfile\\headphoto", 11 "ViewHeadPhotoPath": "/upfile/headphoto", 12 //头像路径 13 "UpContentPhotoPath": "D:\\F\\学习\\vs2017\\netcore\\LovePicture.Web\\wwwroot\\upfile\\contentphoto", 14 "ViewContentPhotoPath": "/upfile/contentphoto", 15 //邮箱模板 16 "EmailTplPath": "D:\\F\\学习\\vs2017\\netcore\\LovePicture.Web\\wwwroot\\tpl", 17 //连接字符串 18 "DbLink": "Server=127.0.0.1,1431;User Id=sa;Password=123123;Database=LovePicture.Db;" 19 } 20 }
要获取这个文件的自定义信息,咱们须要建立一个对应属性名称的实体MoSelfSetting:
1 /// <summary> 2 /// 自定义配置 3 /// </summary> 4 public class MoSelfSetting 5 { 6 /// <summary> 7 /// 头像图片保存地址 8 /// </summary> 9 public string UpHeadPhotoPath { get; set; } 10 11 /// <summary> 12 /// 头像图片访问地址 13 /// </summary> 14 public string ViewHeadPhotoPath { get; set; } 15 16 /// <summary> 17 /// 内容图片保存地址 18 /// </summary> 19 public string UpContentPhotoPath { get; set; } 20 21 /// <summary> 22 /// 查看内容图片保存地址 23 /// </summary> 24 public string ViewContentPhotoPath { get; set; } 25 26 /// <summary> 27 /// 邮件模板文件夹路径 28 /// </summary> 29 public string EmailTplPath { get; set; } 30 31 /// <summary> 32 /// 数据库连接 33 /// </summary> 34 public string DbLink { get; set; } 35 }
实体类属性名称和appsettings.json文件的节点名称同样就好了,而后在ConfigureServices方法中添加配置文件设置:
1 //设置自定义配置信息 2 services.Configure<MoSelfSetting>(Configuration.GetSection("MoSelfSetting"));
仅仅只须要使用这段代码,就能完成从json配置文件的数据到实体数据的转化,比之前的确方便了不少;而后一样经过在Controller中使用IOptions<T>来注入这个配置文件实体到Controller中:
1 private readonly LovePicture_DbContext _context; 2 private readonly MoSelfSetting _selfSetting; 3 private readonly IMemoryCache _cache; 4 5 public MemberController(LovePicture_DbContext context, IOptions<MoSelfSetting> selfSetting, IMemoryCache cache) 6 { 7 _context = context; 8 _selfSetting = selfSetting.Value; 9 _cache = cache; 10 }
最后经过IOptions<T>.Value方式,直接就可以获取出具备配置文件信息的实体数据了;这里就再也不写测试用例了,这些都会在后面一些列章节中运用到,但愿本篇文章能给你好的收获,若是能够不妨点个“赞”,谢谢。