EF Core 2.0上周已经发布了

文章内容基于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做法的优点。

升级到EFCore2.0的更多相关文章

  1. DotNetCore跨平台~EFCore2.0连接Mysql的烦恼-已解决

    回到目录 对于传统的nuget包,我们习惯上用官方或者大型组织的,因为它们比较考靠谱,但就在前两天.net core2.0发布后,我把efcore也升级到2.0了,mysql.EfCore也升级到支持 ...

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

    MVC5+EF6 完整教程17--升级到EFCore2.0 2017年08月22日 14:48:12 linux12a 阅读数:2814   EF Core 2.0上周已经发布了,我们也升级到core ...

  3. ADT for Eclipse无法升级到23.0的解决方法(确保您的网络能够访问google的地址)

    进行以下步骤时,请确保您的网络能够访问google的地址,因为有可能是无法访问google地址导致无法升级,该文不是为了解决这个问题!!! 最近一次的升级,ADT无法从ADT 22.X升级到23.0. ...

  4. Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)

    Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8) 本次演示为升级oracle rac数据库,用GI的psu升级,从11.2.0.4.0升级到11.2.0.4.8 ...

  5. 系统补丁更新导致MVC3.0.0升级到3.0.1的问题解决

    在更新了系统补丁之后,会不知觉的将MVC3.0.0升级到MVC3.0.1的问题,解决的思路如下: 1.全部MVC引用使用NuGet进行包的管理. 2.单独把MVC库抽离出来,然后放在单独的项目文件夹, ...

  6. CMS .NET 程序框架 从2.0/3.5升级到4.0 版本后 需要调整的地方

    问题一: document.forms1.action 不可使用 需要修改程 document.forms[0] .NET 程序框架 从2.0/3.5升级到4.0 版本后,document.forms ...

  7. foxmail 6.5升级到7.0版本后,旧邮件的导入处理

    随着foxmail 7.0版的火热升级,部分从foxmial 6.5版升级到7.0版的用户可能会出现旧邮件丢失的困扰.这里,foxmail为大家提供的解决方案如下:   打开Foxmail,点击 文件 ...

  8. xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题)

    xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题) 前两天为了适配 iOS10 的系统 我将xcode 7.3 升级到了 xcode 8.0 但是 ...

  9. 升级到tomcat7.0碰到的问题

    今天把tomcat从6.0.18升级到7.0.25,发现了两个问题 问题1 java.lang.ClassNotFoundException: org.apache.catalina.mbeans.S ...

随机推荐

  1. 数据结构之栈和队列及其Java实现

    栈和队列是数据结构中非常常见和基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用栈和队列相互实现. 栈:栈是一种基于“后进先出”策略的线性表.在 ...

  2. 【转】odoo 新API装饰器中one、model、multi的区别

    http://blog.csdn.net/qq_18863573/article/details/51114893 1.one装饰器详解 odoo新API中定义方式: date=fields.Date ...

  3. 【BZOJ3611】大工程(虚树,动态规划)

    [BZOJ3611]大工程(虚树,动态规划) 题面 BZOJ Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树 ...

  4. Python破解压缩包密码问题

    所用知识 1. Pool 进程池 2. try...except 异常处理 3.枚举的方式 4.生成器的运用 逻辑关系 通过生成假密码去碰撞!捕获异常,一直碰撞,直到生成的密码与压缩包建立的密码对应, ...

  5. 「日常训练」Divisibility by Eight(Codeforces Round 306 Div.2 C)

    题意与分析 极简单的数论+思维题. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back #de ...

  6. 第四篇 与Flask相关的插件(flask-session、wtforms)

    公司中使用SQL的种方式: 1. 写Django:ORM(关系对象映射), 2. 写Flask和其他:有两种方式: (1) 原生SQL:使用原生SQL有两种选择: A. pymysql (python ...

  7. Python安装教程最新版

    Python安装教程最新版 目前Python官网已经更新到了最新版Python 3.7.1, 相比Python 2系列,它的兼容性不是太好, 不过应该会在不久的将来会全面解决.它的安装比较容易,具体步 ...

  8. JAVA基础学习之路(一)基本概念及运算符

    JAVA基础概念: PATH: path属于操作系统的属性,是系统用来搜寻可执行文件的路径 CALSSPATH: java程序解释类文件时加载文件的路径 注释: 单行注释  // 多行注释 /*... ...

  9. 利用nohup后台运行jar文件包程序

    Linux 运行jar包命令如下: 方式一: java -jar XXX.jar特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 j ...

  10. Chameleon-mini简介

    ChameleonMini(变色龙)原德国大学在研究RFID安全时所设计的一块针对多频段多类型RFID模拟的硬件,其设计本身支持ISO14443和ISO15693标准协议,最简单直接的用法就是把获取到 ...