Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了MVC5+EF6 完整教程17--升级到EFCore2.0(转)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

MVC5+EF6 完整教程17--升级到EFCore2.0 2017年08月22日 14:48:12 linux12a 阅读数:2814   EF Core 2.0上周已经发布了,我们也升级到core 文章内容基于vs2017,请大家先安装好vs2017(15.3). 本篇文章主要讲下差异点,跟之前一样的就不再重复了。 文章目录(差异点): 一、新建项目, EF配置/使用 过程的变化 二、身份验证
@H_502_9@mVC5+EF6 完整教程17--升级到EFCore2.0
@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@四、读取config过程(认取消了web.config,改为读 json配置文件

一、EF使用

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

@H_944_36@我们先新建个项目。

@H_944_36@选择如下模板

@H_944_36@

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

@H_944_36@ 

@H_944_36@ 

@H_944_36@

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

@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@

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

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

@H_944_36@新建Context,跟之前文章的过程类似,如下图,不再细说。

@H_944_36@

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

@H_944_36@ 

@H_944_36@4、给context增加DI (dependency injection,依赖注入)

@H_944_36@之前我们讲了DI的原理与实现,ASP.NET Core认实现了DI,服务在启动时进行注册,通过构造函数的方式获取

@H_944_36@我们只需要按照框架需要的填空即可。

@H_944_36@打开Startup.cs,注册context,如下方框处

@H_944_36@ 

@H_944_36@

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

@H_944_36@ 

@H_944_36@修改配套的 DefaultConnection

@H_944_36@打开appsetTings.json文件增加配置节:

@H_944_36@

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

@H_944_36@ 

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

@H_944_36@

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

@H_944_36@Startup中修改Configure方法调用刚刚的方法

@H_944_36@

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

@H_944_36@ 

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

@H_944_36@ 

@H_944_36@

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

@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@

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

@H_944_36@添加会出现一个txt文档ScaffoldingReadMe.txt,可以删除它。

@H_944_36@我们添加一个Control来读取数据库中数据。

@H_944_36@

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

@H_944_36@

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

@H_944_36@ 

@H_944_36@主要差异是获得context的方式,通过构造函数注入。

@H_944_36@之前我们都是直接new一个context,原来:

@H_944_36@privite XxxContext db=new XxxContext();

@H_944_36@现在:

@H_944_36@

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

@H_944_36@我们加个断点调试下,可以看到获得了user的列表。

@H_944_36@

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

@H_944_36@另外提一下,新建Controller时,如果使用带视图的模板,会发现认使用了异步的方式,类似于:

@H_944_36@public async Task<IActionResult> index()

@H_944_36@{

@H_944_36@return view(await _context.XXX.ToListAsync());

@H_944_36@}

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

@H_944_36@ 

二、身份验证

@H_944_36@原来是在web.config中配置为form认证的,现在web.config没有了,当然认就不采取这种方式了。

@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. 在Configureservices 中配置 Cookie 中间件

@H_944_36@

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

@H_944_36@ 

@H_944_36@2. 在Configure中使用COokie中间件:app.UseAuthentication();

@H_944_36@

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

@H_944_36@ 

@H_944_36@注意:EFCore 1.1 和2.0是不一样的,如果是1.1的版本需做如下修改(差不多两个方法中的内容刚好调换了):

@H_944_36@1.添加如下方框处内容,Configuraservices方法中启用验证。

@H_944_36@

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

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

@H_944_36@

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

@H_944_36@ 

@H_944_36@二、完成登录功能

@H_944_36@我们去HomeController中配置Index方法需要验证

@H_944_36@

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

@H_944_36@当再次访问该地址时可以看到跳转登录界面上了

@H_944_36@

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

@H_944_36@接下来我们就完成登录界面

@H_944_36@Login.cshtml增加个表单

@H_944_36@

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

@H_944_36@显示如下

@H_944_36@

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

@H_944_36@下面我们增加AccountController中的Login方法完成登录

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

@H_944_36@我直接给出具体做法,实际应用时直接修改方法即可。

@H_944_36@我们就不去数据库验证了,直接定义一个Testuser

@H_944_36@

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

@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@

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

@H_944_36@另外登出方法为:

@H_944_36@await httpContext.SignOutAsync("MyCookieAuthenticationscheR_780_11845@e");

@H_944_36@比较简单就不再演示了。

@H_944_36@注意:1.1版本登出方法

@H_944_36@httpContext.Authentication.SignOutAsync("MyCookieAuthenticationscheR_780_11845@e ");

@H_944_36@关于登录说明的官方文档:

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

@H_944_36@ 

三、原生sql

@H_944_36@使用原生sql分为查询和更新两类。

@H_944_36@更新和之前是一样的,可以参我之前文章http://www.cnblogs.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 = _context.Database.ExecutesqlCommand(sql,paras);

@H_944_36@ 

@H_944_36@查询之前的做法Database.sqlQuery或DbSet.sqlQuery就不能用了。

@H_944_36@Core2.0中用Fromsql返回实体,例如:

@H_944_36@int id=1;

@H_944_36@String sql= "SELECT * FROM SysUser WHERE ID={0}"

@H_944_36@var user=_context.SysUsers.Fromsql(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("@rolEID",rolEID)

@H_944_36@}; //添加一些参数

@H_944_36@var conn = _context.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.Parameters.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.config,改为读 json配置文件

@H_944_36@1、我们先去appSetTings.json中增加一行数据。

@H_944_36@

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

@H_944_36@2、和使用COntext类似,Startup.cs > Configureservices中增加一个服务

@H_944_36@

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

@H_944_36@3、Controller中使用

@H_944_36@

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

@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/Security/issues

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

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

@H_944_36@祝学习进步:)

大佬总结

以上是大佬教程为你收集整理的MVC5+EF6 完整教程17--升级到EFCore2.0(转)全部内容,希望文章能够帮你解决MVC5+EF6 完整教程17--升级到EFCore2.0(转)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。