EFコア2.0は、先週リリースされた、我々はまた、コアにアップグレード
vs2017に基づいて記事の内容、最初にインストールしてくださいvs2017(15.3)。
この記事では、以前に繰り返されることはありません同じように、主に相違点の次の点についてです。
記事のディレクトリ(相違点を):
まず、新しいプロジェクトのEFの構成の変更/利用
第二に、(認証結果を達成するために、元の形に似ている)認証モードを変更します
ネイティブSQLモード変更の第三に、使用
第四に、(デフォルトはweb.configファイルをキャンセルし、代わりにJSON形式の設定ファイルを読み込む)設定プロセスを読みます
、EFの使用
EFコア新しいプロジェクトを使用する場合は、設定プロセス中にいくつかの変更があります。
私たちは、最初のプロジェクトを作成します。
次のテンプレートを選択します
まず、EFをインストールおよび構成
1、メニューバー、パッケージマネージャコンソールàNuGetパッケージマネージャà選択TOOLS
输入:インストール・パッケージMicrosoft.EntityFrameworkCore.SqlServer
2、テストデータとしてモデルを構築
フォルダモデルを開き、クラスSYSUSERを高めます
3、DAL新しいフォルダは、EF関連するクラスを配置します。
新しいコンテキストは、記事の前に同様のプロセスで、以下に示すように、精巧ではありません。
コンテキストDI(依存性注入、依存性注入)を増加させる4、
私たちは、DI、コンストラクタの方法により取得し、起動時にDI、サービスレジスタのASP.NETコアデフォルトの実装の原則と実装の話をする前に。
私たちは必要なフレームワークに基づいて空白を埋める必要があります。
オープンStartup.csは、ブロックのように、コンテキストを登録します
DefaultConnectionををサポートする変更
appsettings.jsonファイルを開き、構成セクションを追加します。
データベース構造を生成するために、試験データを追加
スタートアップの設定方法、ちょうど呼び出す方法を変更します。
サイトを実行するには、データが生成されたデータベースを参照し、テストすることができます。
5、コントロールがデータを使用します
また、以前のようにコントロールにまったく同じ方法を追加していますが、最初にコントロールを追加する設定オプションがあるでしょう。
右键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认证方面遇到问题,解决方法就是找到了