AspNetCore - MVC实战系列目录

. 爱留图网站诞生

. git源码:https://github.com/shenniubuxing3/LovePicture.Web

. AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型

. AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码

AspNetCore-MVC实战系列(三)之个人中心

AspNetCore-MVC实战系列(四)之账户设置

本章开篇先简单介绍下最近两周自己利用业余时间做的一个图片收集网站,当然这个是靠用户自己上传来收集不是去抓某些个网站的图片,那样没意义,这里我取名为“爱留图”;该网站的简单介绍大家可以参考下上篇的内容爱留图的诞生,这里打算通过一些列的博客讲解如何一步步利用aspnetcore的mvc来开发,希望大家能够喜欢;

Sqlserver表映射实体模型(反向工程生成实体模型)

首先,咋们需要在sqlserver中创建一张用户表To_UserInfo,这里我尽量简单取一些属性作为字段,以下是表结构SQL:

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(,) NOT NULL,
[UserName] [nvarchar]() NOT NULL,
[UserPwd] [nvarchar]() NOT NULL,
[Email] [nvarchar]() NULL,
[NickName] [nvarchar]() NULL,
[Tel] [nvarchar]() NULL,
[Sex] [bit] NOT NULL,
[Introduce] [nvarchar]() NULL,
[HeadPhoto] [nvarchar]() NULL,
[Birthday] [nvarchar]() NULL,
[Addr] [nvarchar]() NULL,
[Blog] [nvarchar]() NULL,
[Status] [int] NOT NULL,
[CreateTime] [datetime] NOT NULL,
[LoginTime] [datetime] NULL,
[Ips] [nvarchar]() 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包:

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数据库生成实体成功,当然不保证其他特殊的情况吧;

在MVC中使用生成的实体模型

首先,通过vs2017创建个Aspnetcore的Mvc项目我取名为LovePicture.Web,我们要了解的是netcore项目基本上都是通过nuget包来引入其他组件,但是强大的vs能够让我们直接通过:右键web项目的“依赖项”-》添加引用-》解决方案-》选择其他项目的名称,以此来添加对其他项目的依赖(主要是新的vs版本所以废话一下);

有了依赖关系我们先来改造一下通过反向工程生成的DbContext代码来满足我们在Web中Mvc的使用;打开模型类库中的LovePicture_DbContext.cs文件,能够看到我们比较熟悉类似于其他EF框架版本的结构,这里我们只需要自动生成的LovePicture_DbContext构造函数删除掉,然后重新添加一个这样的构造函数:

 public LovePicture_DbContext(DbContextOptions<LovePicture_DbContext> options) : base(options) { }

这样就能吧DbContext当做注入服务提供给引入这个类库的项目使用了,我们也仅仅只需要在Web项目中的Startup.cs文件的ConfigureServices方法中添加依赖注入即可:

 //添加数据库上下文
services.AddDbContext<LovePicture_DbContext>(b =>
{ var dbLink = Configuration.GetSection("MoSelfSetting:DbLink").Value;
if (string.IsNullOrWhiteSpace(dbLink)) { throw new Exception("未找到数据库链接。"); } b.UseSqlServer(dbLink); });

这里由于链接数据库的话需要有一个连接串,这里通过DbContextOptionsBuilder的UseSqlServer扩展方法来传递,字符串的来源这里我配置在appsettings.json配置文件中的,因此能够很方便的通过 Configuration.GetSection("MoSelfSetting:DbLink").Value 来读取出配置文件中配置的连接串,当然如果可以你也可以直接在这里吧连接串写死都行,这里截图展示下配置文件的层级关系:

好了有了以上的配置,咋们就能够在MVC的Controller中很好的使用DbContext了,这里通过构造函数注入的方式使用:

     private readonly LovePicture_DbContext _db;
public HomeController(LovePicture_DbContext db)
{
_db = db;
}

到这里Controller中就能够使用DbContext了,我们可以在Action中直接通过各种EF的操作方法来对数据库执行读写命令;

通过IOptions<T>使用自定义配置信息

因为后面文章内容涉及到用户上传头像等信息,所以需要一些可配置的信息(如:上传路径,链接字符串),所以这里需要有读取我们自定义配置节点信息的操作;这里使用现成的appsettings.json文件来配置信息,这里我的配置内容如:

 {
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
},
"MoSelfSetting": {
//图片内容路径
"UpHeadPhotoPath": "D:\\F\\学习\\vs2017\\netcore\\LovePicture.Web\\wwwroot\\upfile\\headphoto",
"ViewHeadPhotoPath": "/upfile/headphoto",
//头像路径
"UpContentPhotoPath": "D:\\F\\学习\\vs2017\\netcore\\LovePicture.Web\\wwwroot\\upfile\\contentphoto",
"ViewContentPhotoPath": "/upfile/contentphoto",
//邮箱模板
"EmailTplPath": "D:\\F\\学习\\vs2017\\netcore\\LovePicture.Web\\wwwroot\\tpl",
//链接字符串
"DbLink": "Server=127.0.0.1,1431;User Id=sa;Password=123123;Database=LovePicture.Db;"
}
}

要获取这个文件的自定义信息,我们需要创建一个对应属性名称的实体MoSelfSetting:

 /// <summary>
/// 自定义配置
/// </summary>
public class MoSelfSetting
{
/// <summary>
/// 头像图片保存地址
/// </summary>
public string UpHeadPhotoPath { get; set; } /// <summary>
/// 头像图片访问地址
/// </summary>
public string ViewHeadPhotoPath { get; set; } /// <summary>
/// 内容图片保存地址
/// </summary>
public string UpContentPhotoPath { get; set; } /// <summary>
/// 查看内容图片保存地址
/// </summary>
public string ViewContentPhotoPath { get; set; } /// <summary>
/// 邮件模板文件夹路径
/// </summary>
public string EmailTplPath { get; set; } /// <summary>
/// 数据库链接
/// </summary>
public string DbLink { get; set; }
}

实体类属性名称和appsettings.json文件的节点名称一样就行了,然后在ConfigureServices方法中添加配置文件设置:

  //设置自定义配置信息
services.Configure<MoSelfSetting>(Configuration.GetSection("MoSelfSetting"));

仅仅只需要使用这段代码,就能完成从json配置文件的数据到实体数据的转化,比以前的确方便了很多;然后同样通过在Controller中使用IOptions<T>来注入这个配置文件实体到Controller中:

  private readonly LovePicture_DbContext _context;
private readonly MoSelfSetting _selfSetting;
private readonly IMemoryCache _cache; public MemberController(LovePicture_DbContext context, IOptions<MoSelfSetting> selfSetting, IMemoryCache cache)
{
_context = context;
_selfSetting = selfSetting.Value;
_cache = cache;
}

最后通过IOptions<T>.Value方式,直接就能够获取出具有配置文件信息的实体数据了;这里就不再写测试用例了,这些都会在后面一些列章节中运用到,希望本篇文章能给你好的收获,如果可以不妨点个“赞”,谢谢。

AspNetCore - MVC实战系列(一)的更多相关文章

  1. AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码

    AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型 . AspNetCore-MVC实战系列(二)之 ...

  2. AspNetCore-MVC实战系列(三)之个人中心

    AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . git源码:https://github.com/shenniubuxing3/LovePicture.Web . AspNetC ...

  3. AspNetCore-MVC实战系列(四)之结尾

    AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . git源码:https://github.com/shenniubuxing3/LovePicture.Web . AspNetC ...

  4. [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst

    一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...

  5. asp.net mvc 实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开asp. ...

  6. MVC实战之排球计分软件(深入了解面向对象编程)

    在此篇博客之前,我已经写了一个实战系列的博客,虽然不太成熟但是相对比较实用,在这篇博客我将继续使用mvc编程此软件. 此篇博客会在一定的时间内完成,此次完成的软件的一个需求是提供给运动员的使用.我将在 ...

  7. Java秒杀系统实战系列~商品秒杀代码实战

    摘要: 本篇博文是“Java秒杀系统实战系列文章”的第六篇,本篇博文我们将进入整个秒杀系统核心功能模块的代码开发,即“商品秒杀”功能模块的代码实战. 内容: “商品秒杀”功能模块是建立在“商品详情”功 ...

  8. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  9. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

随机推荐

  1. 算法模板——sap网络最大流 2(非递归+邻接表)

    实现功能:同最大流 1 这里面主要是把前面的邻接矩阵改成了邻接表,相比之下速度大大提高——本人实测,当M=1000000 N=10000 时,暂且不考虑邻接矩阵会不会MLE,新的程序速度快了很多倍(我 ...

  2. 算法模板——splay区间反转 1

    实现的功能:将序列区间反转,并维护 详见BZOJ3223 var i,j,k,l,m,n,head,a1,a2:longint; s1:ansistring; a,b,c,d,fat,lef,rig: ...

  3. JVM运行和类加载过程

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) (该知识点引用 http://www.cnblogs.com/dingyingsi/p/3760730.h ...

  4. SEO-发信息注意的问题

    SEO是什么? SEO的全称是Search Engine Optimization,翻译过来就是搜索引擎优化,说到搜索引擎,可能不是特别的清楚.通俗点讲,就是百度,谷歌,雅虎,这些可以直接搜索到你想要 ...

  5. (2)写给Web初学者的教案-----让我们开始准备学习

    课前准备 我们将会从零基础带领大家一步一步的学习Web前端技术,这个零基础是什么概念呢?你只要具备以下技能就可以学习: 一.个人学习条件(必备) 会开关电脑,手机.(哇塞,任老师你逗我们吧!). 会打 ...

  6. ZooKeeper的简单理解

    1 ZooKeeper的一致性特点 概念 描述 备注 顺序一致性 以ZXID来保证事务的顺序性 原子性 以ZAB保证原子操作,要么成功,要么失败 单一视图 无论客户端从哪个服务器获取到关于应用的数据都 ...

  7. mybatis 使用@Select 注解,因为字符编码不一致导致mybatis 报错

    使用 mybatis 的@Select 注解, @Select({ "<script>select " + ALL_COLUMNS + " from &quo ...

  8. Exchange 2016 体系结构

    Exchange Server 2016 使用一个构建基块体系结构,提供电子邮件服务,以便在各种规模的组织(从小型组织到最大规模的跨国企业)进行部署.这种体系结构如下图所示.包含两个角色,邮箱服务器角 ...

  9. requireJS 从概念到实战

    requireJS 可以很轻易的将一个项目中的JavaScript代码分割成若干个模块(module).并且requireJS推荐一个模块就是一个文件,所以,你将获得一些零碎的具有互相依赖关系的JS文 ...

  10. css中的inline-block

    div { display: inline-block; *display: inline; *zoom: 1; } Basic Support包含值:none | inline | block | ...