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

祝學習進步:)

相關文章
相關標籤/搜索