EF Core 基礎(chǔ)知識入門教程

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地址

https://github.com/yuyue5945

關(guān)注公眾號不迷路

[站外圖片上傳中...(image-c5a8e3-1608817321961)]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容