MVC5+EF6 完整教程17--升级到EFCore2.0(转)
MVC5+EF6 完整教程17--升级到EFCore2.0
EF Core 2.0上周已经发布了,我们也升级到core
文章内容基于vs2017,请大家先安装好vs2017(15.3).
本篇文章主要讲下差异点,跟之前一样的就不再重复了。
文章目录(差异点):
一、新建项目, EF配置/使用 过程的变化
二、身份验证方式的变化(达到类似于原form认证效果)
三、使用原生SQL方式变化
四、读取config过程(默认取消了web.config, 改为读 json配置文件)
一、EF使用
使用EF Core新建项目时,配置过程有一些变化。
我们先新建个项目。
选择如下模板


一、安装并配置好EF
1、菜单栏选择TOOLS à NuGet Package Manager à Package Manager Console
输入:Install-Package Microsoft.EntityFrameworkCore.SqlServer
2、建一个Model作为测试数据
打开文件夹Models, 增加类SysUser

3、新建文件夹DAL,用来放置EF相关的类。
新建Context,跟之前文章的过程类似,如下图,不再细说。

4、给context增加DI (dependency injection, 依赖注入)
之前我们讲了DI的原理与实现,ASP.NET Core默认实现了DI,服务在启动时进行注册,通过构造函数的方式获取。
我们只需要按照框架需要的填空即可。
打开Startup.cs, 注册context,如下方框处

修改配套的 DefaultConnection
打开appsettings.json文件,增加配置节:

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

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

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


5、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());
}
异步主要是针对数据库操作,如果并发小(例如管理员的后台管理界面),没有必要。如果并发多,提升还是很明显的。我们后面第三部分具体项目时会根据预设并发访问量的大小需要选择性使用异步的方式。
二、身份验证
原来是在web.config中配置为form认证的,现在web.config没有了,当然默认就不采取这种方式了。
我们来看一下ASPNETCore中如何实现身份验证的配置。
准备工作:
先装个包 install-package Microsoft.AspNetCore.Authentication.Cookies
再新建AccountController, 添加一个Login的Action及其配套的View用来完成登录 .(和前面的教程做法一样的,不再细说)
一、打开Startup.cs
1. 在ConfigureServices 中配置 Cookie 中间件

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

注意:EFCore 1.1 和2.0是不一样的,如果是1.1的版本需做如下修改(差不多两个方法中的内容刚好调换了):
1.添加如下方框处内容,ConfiguraServices方法中启用验证。

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

二、完成登录功能
我们去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
三、原生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,略。
四、读取config过程
最后再说一下配置文件的问题。
ASPNETCore默认取消了web.config, 改为读 json配置文件。
1、我们先去appSettings.json中增加一行数据。

2、和使用context类似,Startup.cs > ConfigureServices中增加一个服务

3、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
祝学习进步:)
MVC5+EF6 完整教程17--升级到EFCore2.0(转)的更多相关文章
- MVC5+EF6 完整教程17--升级到EFCore2.0
EF Core 2.0上周已经发布了,我们也升级到core 文章内容基于vs2017,请大家先安装好vs2017(15.3). 本篇文章主要讲下差异点,跟之前一样的就不再重复了. 文章目录(差异点): ...
- MVC5+EF6 完整教程
随笔分类 - MVC ASP.NET MVC MVC5+EF6 完整教程17--升级到EFCore2.0 摘要: EF Core 2.0上周已经发布了,我们也升级到core 文章内容基于vs2017, ...
- MVC5 + EF6 完整教程 (转)
点击查看: MVC5 + EF6
- ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用
文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-ef-6-get-started-model.html 上一节:ASP.NET MVC ...
- ASP.NET + MVC5 入门完整教程八 -—-- 一个完整的应用程序(上)
https://blog.csdn.net/qq_21419015/article/details/80509513 SportsStore 1.开始创建Visual Studio 解决方案和项目这里 ...
- ASP.NET + MVC5 入门完整教程七 -—-- MVC基本工具(上)
https://blog.csdn.net/qq_21419015/article/details/80474956 这里主要介绍三类工具之一的 依赖项注入(DI)容器,其他两类 单元测试框架和模仿工 ...
- ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合
建立松耦合组件 MVC 模式最重要的特性之一视他支持关注分离,希望应用程序中的组件尽可能独立,只有很少的几个可控依赖项.在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他 ...
- MVC5 + EF6 完整入门教程三
期待已久的EF终于来了. 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型,将之前的示例添加数据库查询验证功能. 文章提纲 概述 & ...
- MVC5 + EF6 完整入门教程三:EF来了
期待已久的EF终于来了 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型,将之前的示例添加数据库查询验证功能. 文章提纲 概述 & ...
随机推荐
- 期货大赛项目|九,fileinput插件的应用
引入JS和CSS bundles.Add(new ScriptBundle("~/bundles/fileinputJs").Include( "~/Content/ve ...
- 会话技术、Cookie技术与Session技术
一.会话技术 1. 存储客户端状态 会话技术是帮助服务器记住客户端状态(区分客户端)的. 2. 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录这 ...
- Java模拟耗时任务异步执行
说明:耗时任务开启单独线程处理,任务线程处理完毕通知主线程 1.回调接口定义 public interface ResponseCallBack { public void printMsg(Stri ...
- 业务线--node中间层做一个透传的项目
1,node中间层总结 1,ejs引入vue的js,路由层(直接透传,自定义行的),比较浅层的一层 中间件的引入 ? ) { // 与rd约定,接口成功返回code===0,其余为失败 console ...
- JMeter性能测试中控制业务比例
性能测试混合场景中,我们需要组合多个业务操作到场景中来.比如有一个论坛的业务分布如下:发布新帖与回复帖子的比例为2:3,那么我们在JMeter测试计划中如何控制其比例呢? 可以通过以下两种方式解决:多 ...
- [linux]主机访问虚拟机web服务(CentOS)
目的为了实现主机和虚拟机的通信,访问虚拟机中架设的web服务.按理说通过虚拟机ip + web服务端口,即可在浏览器访问虚拟机的web服务.但是由于CentOS的防火墙问题,对应web端口无法访问.通 ...
- Android系统API综述
下述能够找到Android开发源代码: 1. http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.andro ...
- 阿里云 Windows 2012 如果安装IIS
用可视化安装如果出错, 那就用 windows powershell 安装 https://help.aliyun.com/knowledge_detail/40959.html?spm=5176.1 ...
- cons-跨域请求
当一个资源从与该资源本身所在的服务器不同的域或端口不同的域或不同的端口请求一个资源时,资源会发起一个跨域 HTTP 请求. 出于安全考虑,浏览器会限制从脚本内发起的跨域HTTP请求.例如,XMLHtt ...
- HTML5:离线存储
最近由于找工作一直没时间也没有精力更新博客,找工作真是一件苦逼的事情啊...不抱怨了,我们来看看HTML5的新特性---离线存储吧. 随着Web App的发展,越来越多的移动端App使用HTML5的方 ...