EF Core 基礎(chǔ)概念
概念
EF Core 全稱是Entity Framework Core,可使用 EF Core 開發(fā)面向 .NET Core 的應(yīng)用,EF Core 同時支持在 Visual StudioVisual Studio for Mac 或 Visual Studio Code 等環(huán)境下開發(fā)。雖然EF CORO 同樣支持在Xamarin和.Net Native 上實現(xiàn)運行,但是存在運行限制,可能會影響EF Core處理的效率,暫不推薦使用。
技術(shù)大綱
Entity Framework (EF) Core 是輕量化、可擴展、開源和跨平臺版的常用 Entity Framework 數(shù)據(jù)訪問技術(shù)。
EF Core 可用作對象關(guān)系映射程序 (O/RM),這可以實現(xiàn)以下兩點:
- 使 .NET 開發(fā)人員能夠使用 .NET 對象處理數(shù)據(jù)庫。
- 無需再像通常那樣編寫大部分數(shù)據(jù)訪問代碼。
EF Core 支持多個數(shù)據(jù)庫引擎。
獲取 Entity Framework Core 運行時
舉例:安裝或更新 EF Core SQL Server 的途徑
三種途徑
- NET Core CLI (控制臺命令行操作頁面可執(zhí)行)
- 執(zhí)行“dotnet add package Microsoft.EntityFrameworkCore.SqlServer”該指令
- 可以使用 -v 修飾符在 dotnet add package 命令中指明特定的版本。 例如,若要安裝 EF Core 2.2.0 包,請將 -v 2.2.0 追加到命令中。
- Visual Studio NuGet 包管理器對話框
- 從 Visual Studio 菜單中選擇“項目”>“管理 NuGet 包”
- 單擊“瀏覽”或“更新”選項卡
- 若要安裝或更新 SQL Server 提供程序,請選擇 Microsoft.EntityFrameworkCore.SqlServer 包并確認。
- Visual Studio NuGet 包管理器控制臺
- 從 Visual Studio 菜單中選擇“工具”>“NuGet 包管理器”>“包管理器控制臺”
- Install-Package Microsoft.EntityFrameworkCore.SqlServer
- 若要更新提供程序,使用 Update-Package 命令。
- 若要指定特定版本,可以使用 -Version 修飾符。 例如,若要安裝 EF Core 2.2.0 包,請將 -Version 2.2.0 追加到命令中。
EF CORE 實操內(nèi)容
模型
對于 EF Core,使用模型執(zhí)行數(shù)據(jù)訪問。 模型由實體類和表示數(shù)據(jù)庫會話的上下文對象DBContext構(gòu)成。 上下文對象允許查詢并保存數(shù)據(jù)。
EF 支持以下模型開發(fā)方法:
- 從現(xiàn)有數(shù)據(jù)庫生成模型。
- 對模型手動編碼,使其符合數(shù)據(jù)庫。
- 創(chuàng)建模型后,使用 EF 遷移從模型創(chuàng)建數(shù)據(jù)庫。 模型發(fā)生變化時,遷移可讓數(shù)據(jù)庫不斷演進。
EF 中的重要元素DBContext
DbContext是實體類和數(shù)據(jù)庫之間的橋梁,DbContext主要負責與數(shù)據(jù)交互,主要作用:
- DBContext 包含所有實體映射到數(shù)據(jù)庫的實體集【
DbSet<TEntity>】 - DBContext 將LINQ TO Entities 查詢轉(zhuǎn)換成DBServer認識的SQL語句
- DBContext跟蹤實體從數(shù)據(jù)庫中查詢出來后發(fā)生的修改變化
- DBContext支持持久化數(shù)據(jù)庫
如下圖所示
[站外圖片上傳中...(image-e45b32-1608817321961)]
DBContext 詳細介紹
DBContext 是一個實現(xiàn)上述功能,自然類體積較大,截取部分方法展示如下:
[站外圖片上傳中...(image-a4a8c8-1608817321961)]
如下展示一段代碼以便更好理解:
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
namespace Intro
{
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=Blogging;Integrated Security=True");
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public int Rating { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
}
查詢
使用語言集成查詢 (LINQ) 從數(shù)據(jù)庫檢索實體類的實例。其中,where 和 Orderby 兩個方法并不執(zhí)行數(shù)據(jù)庫操作 這里重點說明一下,只有ToList 這個操作,才會真正去數(shù)據(jù)庫執(zhí)行查詢。
using (var db = new BloggingContext())
{
var blogs = db.Blogs
.Where(b => b.Rating > 3)
.OrderBy(b => b.Url)
.ToList();
}
保存數(shù)據(jù)
使用實體類的實例在數(shù)據(jù)庫中創(chuàng)建、刪除和修改數(shù)據(jù)。
using (var db = new BloggingContext())
{
var blog = new Blog { Url = "http://sample.com" };
db.Blogs.Add(blog);
db.SaveChanges();
}
EF O/RM 注意事項
雖然 EF Core 善長提取許多編程詳細信息,但還是有一些適用于任何 O/RM 的最佳做法,可幫助避免生產(chǎn)應(yīng)用中的常見陷阱:
- 若要在高性能生產(chǎn)應(yīng)用中構(gòu)建、調(diào)試、分析和遷移數(shù)據(jù),必須具備基礎(chǔ)數(shù)據(jù)庫服務(wù)器的中級知識或更高級別的知識。 例如,有關(guān)主鍵和外鍵、約束、索引、標準化、DML 和 DDL 語句、數(shù)據(jù)類型、分析等方面的知識。
- 功能和集成測試:請務(wù)必盡可能嚴密地復(fù)制生產(chǎn)環(huán)境,以便:
- 查找僅在使用特定版本的數(shù)據(jù)庫服務(wù)器時才出現(xiàn)的問題。
- 在升級 EF Core 和其他依賴項時捕獲中斷性變更。 例如,添加或升級 ASP.NET Core、OData 或 Automapper 等框架。 這些依賴項可能以多種意外方式影響 EF Core。
- 通過代表性負載進行性能和壓力測試。 某些功能的不成熟用法縮放性不佳。 例如,多項集合包含內(nèi)容、大量使用延遲加載、對未編制索引的列執(zhí)行條件查詢、對存儲生成的值進行大規(guī)模更新和插入、缺乏并發(fā)處理、大型模型、緩存策略不充分。
- 安全評審:例如,連接字符串和其他機密處理、非部署操作的數(shù)據(jù)庫權(quán)限、原始 SQL 的輸入驗證、敏感數(shù)據(jù)加密。
- 確保日志記錄和診斷充足且可用。 例如,適當?shù)娜罩居涗浥渲?、查詢標記?Application Insights。
- 錯誤恢復(fù)。 為常見故障場景(如版本回退、回退服務(wù)器、橫向擴展和負載平衡、DoS 緩解和數(shù)據(jù)備份)準備應(yīng)急計劃。
- 應(yīng)用程序部署和遷移。 規(guī)劃如何在部署過程中應(yīng)用遷移;在應(yīng)用程序啟動時執(zhí)行此操作可能會導(dǎo)致并發(fā)問題,并且對于常規(guī)操作,這所需的權(quán)限比必要權(quán)限更高。 在遷移期間,使用暫存來輔助從錯誤中恢復(fù)。 有關(guān)詳細信息,請參閱應(yīng)用遷移。
- 生成的遷移的詳細檢查和測試。 將遷移應(yīng)用于生產(chǎn)數(shù)據(jù)前,應(yīng)對其進行全面測試。 若表中包含生產(chǎn)數(shù)據(jù),架構(gòu)的形狀和列類型就不能輕易更改。 例如,在 SQL Server 上,對于映射到字符串和十進制屬性的列,nvarchar(max) 和 decimal(18, 2) 極少成為最佳類型,但這些是 EF 使用的默認值,因為 EF 不了解你的具體情況。
博主GitHub地址
關(guān)注公眾號不迷路
[站外圖片上傳中...(image-c5a8e3-1608817321961)]