@H_
944_36@EF Core 2.0上周已经发布了,我们也
升级到core
@H_
944_36@
文章内容基于vs2017,请大家先安装好vs2017(15.3).
@H_
944_36@本篇
文章主要讲下差异点,跟之前一样的就不再重复了。
文章目录(差异点):
@H_
944_36@一、新建项目,EF配置/使用 过程的变化
@H_
944_36@二、身份验证方式的变化(达到类似于原form认证
效果)
@H_
944_36@三、使用原生
sql方式变化
@H_
944_36@四、读取con
fig过程(
默认取消了web.con
fig,改为读 json
配置文件)
一、EF使用
@H_
944_36@使用EF Core新建项目时,配置过程有一些变化。
@H_
944_36@我们先新
建个项目。
@H_
944_36@选择如下模板
@H_
944_36@
@H_
944_36@
@H_
944_36@
@H_
944_36@
@H_
944_36@
@H_
944_36@
@H_
944_36@一、安装并配置好EF
@H_
944_36@1、
菜单栏选择TOOLS à NuGet Package Manager à Package Manager Console
@H_
944_36@输入:Install-Package Microsoft.EntityFrameworkCore.
sqlServer
@H_
944_36@2、建@L_608_18
@model作为测试数据
@H_
944_36@打开
文件夹Models,
增加类SysUser
@H_
944_36@
@H_
944_36@3、新建
文件夹DAL,用来放置EF相关的类。
@H_
944_36@新建Co
ntext,跟之前
文章的过程类似,如下图,不再细说。
@H_
944_36@
@H_
944_36@
@H_
944_36@4、给co
ntext
增加DI (dependency in
jection,依赖注入)
@H_
944_36@之前我们讲了DI的原理与实现,ASP.NET Core
默认实现了DI,服务在启动时进行
注册,通过构造
函数的方式
获取。
@H_
944_36@我们只需要按照框架需要的填空
即可。
@H_
944_36@打开Startup.cs,
注册co
ntext,如下方框处
@H_
944_36@
@H_
944_36@
@H_
944_36@
@H_
944_36@
修改配套的 DefaultConnection
@H_
944_36@打开appset
Ting
s.json
文件,
增加配置节:
@H_
944_36@
@H_
944_36@
@H_
944_36@
添加测试数据,
生成数据库结构
@H_
944_36@
@H_
944_36@Startup中
修改Con
figure
方法,
调用刚刚的
方法。
@H_
944_36@
@H_
944_36@
@H_
944_36@运行一下网站,可以看到
数据库和测试数据都已
生成。
@H_
944_36@
@H_
944_36@
@H_
944_36@
@H_404_149@
@H_
944_36@
@H_
944_36@5、Control中使用数据
@H_
944_36@
添加Control的方式也和以前一模一样,不过第一次
添加Control时
会出现一个设定选项。
@H_
944_36@右键Controls
文件夹,选择
菜单 AddàControl,第一次
会出现Add MVC Dependencies设置,我们选择 Minimal Dependencies
@H_
944_36@
@H_
944_36@
添加后
会出现一个txt文档ScaffoldingReadMe.txt,可以
删除它。
@H_
944_36@我们
添加一个Control来读取
数据库中数据。
@H_
944_36@
@H_
944_36@
@H_
944_36@
@H_
944_36@主要差异是获得co
ntext的方式,通过构造
函数注入。
@H_
944_36@之前我们都是直接new
一个co
ntext,原来:
@H_
944_36@privite XxxCo
ntext db=new XxxCo
ntext(
);
@H_
944_36@现在:
@H_
944_36@
@H_
944_36@我们加个断点调试下,可以看到获得了user的列表。
@H_
944_36@
@H_
944_36@另外提一下,新建Controller时,如果使用带视图的模板,会发现
默认使用了异步的方式,类似于:
@H_
944_36@public async Task<IActionResult>
index()
@H_
944_36@
{
@H_
944_36@return
view(await _co
ntext.XXX.ToListAsync()
);
@H_
944_36@}
@H_
944_36@异步主要是针对
数据库操作,如果并发小(例如
管理员的
后台管理界面),没有必要。如果并发多,提升还是很明显的。我们后面第三部分具体项目时会根据预设并发访问量的大小需要选择性使用异步的方式。
@H_
944_36@
二、身份验证
@H_
944_36@原来是在web.con
fig中配置为form认证的,现在web.con
fig没有了,当然
默认就不采取这种方式了。
@H_
944_36@我们来看一下ASPNETCore中
如何实现身份验证的配置。
@H_
944_36@准备工作:
@H_
944_36@先装个包 install-package Microsoft.AspNetCore.Authentication.Cookies
@H_
944_36@再新建AccountController,
添加一个Login的Action及其配套的View用来完成
登录 .(和前面的教程做法一样的,不再细说)
@H_
944_36@一、打开Startup.cs
@H_
944_36@1. 在Con
figure
services 中配置 Cookie 中间件
@H_
944_36@
@H_
944_36@
@H_
944_36@2. 在Con
figure中
使用COokie中间件:app.UseAuthentication(
);
@H_
944_36@
@H_
944_36@
@H_
944_36@注意:EFCore 1.1 和2.0是不一样的,如果是1.1的版本需做如下
修改(差不多两个
方法中的
内容刚好调换了):
@H_
944_36@1.
添加如下方框处
内容,Con
figura
services
方法中启用验证。
@H_
944_36@
@H_
944_36@2. Con
fig方法中配置验证相关信息
@H_
944_36@
@H_
944_36@
@H_
944_36@二、完成
登录功能
@H_
944_36@我们去HomeController中配置Index
方法需要验证
@H_
944_36@
@H_
944_36@当再次访问该地址时可以看到
跳转到
登录界面上了
@H_
944_36@
@H_
944_36@接下来我们就完成
登录界面
@H_
944_36@Login.cshtml
增加个表单
@H_
944_36@
@H_
944_36@
显示如下
@H_
944_36@
@H_
944_36@下面我们
增加AccountController中的Login
方法完成
登录。
@H_
944_36@核心就是要构建
一个 ClaimsPrincipal的实例。
@H_
944_36@我直接给出具体做法,实际应用时直接
修改此
方法即可。
@H_
944_36@我们就不去
数据库验证了,直接定义
一个Te
stuser
@H_
944_36@
@H_
944_36@
@H_
944_36@
前台要
获取登录的
用户名,使用 @User.Identity.Name
即可。
@H_
944_36@我们在
菜单上
增加一项:
@H_
944_36@<li><a>Current User: @User.Identity.Name</a></li>
@H_
944_36@结果:
@H_
944_36@
@H_
944_36@另外登出
方法为:
@H_
944_36@await
httpCo
ntext.SignOutAsync("MyCookieAuthentication
scheR_780_11845@e"
);
@H_
944_36@比较简单就不再演示了。
@H_
944_36@注意:1.1版本登出
方法为
@H_
944_36@
httpCo
ntext.Authentication.SignOutAsync("MyCookieAuthentication
scheR_780_11845@e "
);
@H_
944_36@关于
登录说明的官方文档:
@H_
944_36@
https://doc
s.microsoft.com/zh-cn/aspnet/core/s
ecurity/authentication/cookie
@H_
944_36@
@H_
944_36@使用原生
sql分为
查询和更新两类。
@H_
944_36@更新和之前是一样的,
可以参考我之前
文章http://www.cnblog
s.com/miro/p/4518811.html
@H_
944_36@
代码示
例:
@H_
944_36@
String
sql= "
deletE FROM [SysUserRole] WHERE [SysUserID]
[email protected] ";
@H_
944_36@
sqlParameter[] paras = new
sqlParameter[]
{
@H_
944_36@new
sqlParameter("@userId",userId)
@H_
944_36@};
@H_
944_36@int
res = _co
ntext.Database.Execute
sqlCommand(
sql,paras
);
@H_
944_36@
@H_
944_36@
查询之前的做法Database.
sqlQuery或DbSet.
sqlQuery就不能用了。
@H_
944_36@Core2.0中用From
sql返回实体,例如:
@H_
944_36@
int id=1;
@H_
944_36@
String
sql= "
SELECT * FROM SysUser WHERE ID=
{0}"
@H_
944_36@var user=_co
ntext.SysUser
s.From
sql(
sql,id
); //
后面的省略
@H_
944_36@
@H_
944_36@这种不具备太多实用性,因为不用
sql也可以很容易实现
查询。
@H_
944_36@下面直接给出通用的范
例:
@H_
944_36@
String query = @"复杂的
sql语句";
@H_
944_36@
sqlParameter[] paras = new
sqlParameter[]
{
@H_
944_36@new
sqlParameter("@rol
EID",rol
EID)
@H_
944_36@}; //
添加一些参数
@H_
944_36@var conn = _co
ntext.Database.GetDbConnection(
);
@H_
944_36@try
@H_
944_36@
{
@H_
944_36@conn.
open();
@H_
944_36@using (var command = conn.CreateCommand())
@H_
944_36@
{
@H_
944_36@command.CommandText = query;
@H_
944_36@command.Parameter
s.AddRange(paras
);
@H_
944_36@DbDataReader
reader = command.ExecuteReader(
);
@H_
944_36@// 下面处理得到的
reader,略
@H_
944_36@}
@H_
944_36@}
@H_
944_36@catch (Exception)
@H_
944_36@
{
@H_
944_36@
@H_
944_36@throw;
@H_
944_36@}
@H_
944_36@finally
@H_
944_36@
{
@H_
944_36@conn.Close(
);
@H_
944_36@}
@H_
944_36@我们一般用while循环处理 得到的reader,略。
@H_
944_36@
四、读取config过程
@H_
944_36@最后再说一下
配置文件的问题。
@H_
944_36@ASPNETCore
默认取消了web.con
fig,改为读 json
配置文件。
@H_
944_36@1、我们先去appSet
Ting
s.json中
增加一行数据。
@H_
944_36@
@H_
944_36@2、和
使用COntext类似,Startup.cs > Con
figure
services中
增加一个服务
@H_
944_36@
@H_
944_36@3、Controller中使用
@H_
944_36@
@H_
944_36@加个断点调试下,可以看到,已经可以取到值了。
@H_
944_36@
总结
@H_
944_36@ASPNETCore2.0
做了比较大的改变,有些在1.1的
用法到2.0直接就废弃了,还是比较激进的。另外
还有一些其他的小细节变化,等具体项目时碰到再说。
@H_
944_36@大家先学会怎么使用,有空再去体会Core2.0做法的优点。
@H_
944_36@另外,关于一些Core2.0的问题可以到如下地址查看
@H_
944_36@
https://github.com/aspnet/S
ecurity/issues
@H_
944_36@例如我从1.1到2.0认证方面
遇到问题,
解决方法就是找到了
@H_
944_36@
https://github.com/aspnet/S
ecurity/issues/1310
@H_
944_36@祝学习进步:)