MVC5+EF6 完整教程17--升级到EFCore2.0

EF Core 2.0上周已经发布了,咱们也升级到corehtml

文章内容基于vs2017,请你们先安装好vs2017(15.3).git

本篇文章主要讲下差别点,跟以前同样的就再也不重复了。github

文章目录(差别点):

1、新建项目, EF配置/使用 过程的变化web

2、身份验证方式的变化(达到相似于原form认证效果)sql

3、使用原生SQL方式变化数据库

4、读取config过程(默认取消了web.config, 改成读 json配置文件)json

1、EF使用

使用EF Core新建项目时,配置过程有一些变化。cookie

咱们先新建个项目。并发

选择以下模板app

 

 

 

 

1、安装并配置好EF

一、菜单栏选择TOOLS à NuGet Package Manager à Package Manager Console

输入:Install-Package Microsoft.EntityFrameworkCore.SqlServer

二、建一个Model做为测试数据

打开文件夹Models, 增长类SysUser

三、新建文件夹DAL,用来放置EF相关的类。

新建Context,跟以前文章的过程相似,以下图,再也不细说。

 

四、给context增长DI (dependency injection, 依赖注入)

以前咱们讲了DI的原理与实现,ASP.NET Core默认实现了DI,服务在启动时进行注册,经过构造函数的方式获取。

咱们只须要按照框架须要的填空便可。

打开Startup.cs, 注册context,以下方框处

 

 

修改配套的 DefaultConnection

打开appsettings.json文件,增长配置节:

 

添加测试数据,生成数据库结构

Startup中修改Configure方法,调用刚刚的方法。

 

运行一下网站,能够看到数据库和测试数据都已生成。

 

 

五、Control中使用数据

添加Control的方式也和之前如出一辙,不过第一次添加Control时会出现一个设定选项。

右键Controls文件夹,选择菜单 AddàControl, 第一次会出现Add MVC Dependencies设置,咱们选择 Minimal Dependencies

添加后会出现一个txt文档ScaffoldingReadMe.txt,能够删除它。

咱们添加一个Control来读取数据库中数据。

 

主要差别是得到context的方式,经过构造函数注入。

以前咱们都是直接new一个context, 原来:

privite XxxContext db=new XxxContext();

如今:

咱们加个断点调试下,能够看到得到了user的列表。

另外提一下,新建Controller时,若是使用带视图的模板,会发现默认使用了异步的方式,相似于:

public async Task<IActionResult> Index()

{

return View(await _context.XXX.ToListAsync());

}

异步主要是针对数据库操做,若是并发小(例如管理员的后台管理界面),没有必要。若是并发多,提高仍是很明显的。咱们后面第三部分具体项目时会根据预设并发访问量的大小须要选择性使用异步的方式。

 

2、身份验证

原来是在web.config中配置为form认证的,如今web.config没有了,固然默认就不采起这种方式了。

咱们来看一下ASPNETCore中如何实现身份验证的配置。

准备工做:

先装个包 install-package Microsoft.AspNetCore.Authentication.Cookies

再新建AccountController, 添加一个Login的Action及其配套的View用来完成登陆 .(和前面的教程作法同样的,再也不细说)

1、打开Startup.cs

1. 在ConfigureServices 中配置 Cookie 中间件

 

2. 在Configure中使用Cookie中间件:app.UseAuthentication();

 

注意:EFCore 1.1 和2.0是不同的,若是是1.1的版本需作以下修改(差很少两个方法中的内容恰好调换了):

1.添加以下方框处内容,ConfiguraServices方法中启用验证。

2. Config方法中配置验证相关信息

 

2、完成登陆功能

咱们去HomeController中配置Index方法须要验证

当再次访问该地址时能够看到跳转到登陆界面上了

接下来咱们就完成登陆界面

Login.cshtml增长个表单

显示以下

下面咱们增长AccountController中的Login方法完成登陆。

核心就是要构建一个 ClaimsPrincipal的实例。

我直接给出具体作法,实际应用时直接修改此方法便可。

咱们就不去数据库验证了,直接定义一个TestUser

 

前台要获取登陆的用户名,使用 @User.Identity.Name 便可。

咱们在菜单上增长一项:

<li><a>Current User: @User.Identity.Name</a></li>

结果:

另外登出方法为:

await HttpContext.SignOutAsync("MyCookieAuthenticationScheme");

比较简单就再也不演示了。

注意1.1版本登出方法为

HttpContext.Authentication.SignOutAsync("MyCookieAuthenticationScheme ");

关于登陆说明的官方文档:

https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/cookie

 

3、原生SQL

使用原生SQL分为查询和更新两类。

更新和以前是同样的,能够参考我以前文章http://www.cnblogs.com/miro/p/4518811.html

代码示例:

string sql= "DELETE FROM [SysUserRole] WHERE [SysUserID]=@userId ";

SqlParameter[] paras = new SqlParameter[]{

new SqlParameter("@userId",userId)

};

int res = _context.Database.ExecuteSqlCommand(sql, paras);

 

查询以前的作法Database.SqlQuery或DbSet.SqlQuery就不能用了。

Core2.0中用FromSql返回实体,例如:

int id=1;

string sql= "SELECT * FROM SysUser WHERE ID={0}"

var user=_context.SysUsers.FromSql(sql, id); // 后面的省略

 

这种不具有太多实用性,由于不用SQL也能够很容易实现查询。

下面直接给出通用的范例:

string query = @"复杂的sql语句";

SqlParameter[] paras = new SqlParameter[]{

new SqlParameter("@roleId",roleId)

}; //添加一些参数

var conn = _context.Database.GetDbConnection();

try

{

conn.Open();

using (var command = conn.CreateCommand())

{

command.CommandText = query;

command.Parameters.AddRange(paras);

DbDataReader reader = command.ExecuteReader();

// 下面处理获得的 reader,略

}

}

catch (Exception)

{

 

throw;

}

finally

{

conn.Close();

}

咱们通常用while循环处理 获得的reader,略。

 

4、读取config过程

最后再说一下配置文件的问题。

ASPNETCore默认取消了web.config, 改成读 json配置文件。

一、咱们先去appSettings.json中增长一行数据。

二、和使用context相似,Startup.cs > ConfigureServices中增长一个服务

三、Controller中使用

加个断点调试下,能够看到,已经能够取到值了。

 

总结

ASPNETCore2.0作了比较大的改变,有些在1.1的用法到2.0直接就废弃了,仍是比较激进的。另外还有一些其余的小细节变化,等具体项目时碰到再说。

你们先学会怎么使用,有空再去体会Core2.0作法的优势。

另外,关于一些Core2.0的问题能够到以下地址查看

https://github.com/aspnet/Security/issues

例如我从1.1到2.0认证方面遇到问题,解决方法就是找到了

https://github.com/aspnet/Security/issues/1310

祝学习进步:)

相关文章
相关标签/搜索