EF Core 快速入門教程

EF Core 基礎概念

概念git

EF Core 全稱是Entity Framework Core,可以使用 EF Core 開發面向 .NET Core 的應用,EF Core 同時支持在 Visual StudioVisual Studio for Mac 或 Visual Studio Code 等環境下開發。雖然EF CORO 一樣支持在Xamarin和.Net Native 上實現運行,可是存在運行限制,可能會影響EF Core處理的效率,暫不推薦使用。github

技術大綱sql

Entity Framework (EF) Core 是輕量化、可擴展、開源和跨平臺版的經常使用 Entity Framework 數據訪問技術。數據庫

EF Core 可用做對象關係映射程序 (O/RM),這能夠實現如下兩點:編程

  • 使 .NET 開發人員可以使用 .NET 對象處理數據庫。
  • 無需再像一般那樣編寫大部分數據訪問代碼。

EF Core 支持多個數據庫引擎。緩存

獲取 Entity Framework Core 運行時

舉例:安裝或更新 EF Core SQL Server 的途徑安全

三種途徑服務器

  • NET Core CLI (控制檯命令行操做頁面可執行)架構

    • 執行「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 實操內容

模型

對於 EF Core,使用模型執行數據訪問。 模型由實體類和表示數據庫會話的上下文對象DBContext構成。 上下文對象容許查詢並保存數據。

EF 支持如下模型開發方法:

  • 從現有數據庫生成模型。
  • 對模型手動編碼,使其符合數據庫。
  • 建立模型後,使用 EF 遷移從模型建立數據庫。 模型發生變化時,遷移可以讓數據庫不斷演進。

EF 中的重要元素DBContext

DbContext是實體類和數據庫之間的橋樑,DbContext主要負責與數據交互,主要做用:

  • DBContext 包含全部實體映射到數據庫的實體集【DbSet<TEntity>
  • DBContext 將LINQ TO Entities 查詢轉換成DBServer認識的SQL語句
  • DBContext跟蹤實體從數據庫中查詢出來後發生的修改變化
  • DBContext支持持久化數據庫

以下圖所示
20201224205010-2020-12-24

DBContext 詳細介紹

DBContext 是一個實現上述功能,天然類體積較大,截取部分方法展現以下:

20201224205741-2020-12-24

以下展現一段代碼以便更好理解:

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) 從數據庫檢索實體類的實例。其中,where 和 Orderby 兩個方法並不執行數據庫操做 這裏重點說明一下,只有ToList 這個操做,纔會真正去數據庫執行查詢。

using (var db = new BloggingContext())
{
    var blogs = db.Blogs
        .Where(b => b.Rating > 3)
        .OrderBy(b => b.Url)
        .ToList();
}

保存數據

使用實體類的實例在數據庫中建立、刪除和修改數據。

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 的最佳作法,可幫助避免生產應用中的常見陷阱:

  • 若要在高性能生產應用中構建、調試、分析和遷移數據,必須具有基礎數據庫服務器的中級知識或更高級別的知識。 例如,有關主鍵和外鍵、約束、索引、標準化、DML 和 DDL 語句、數據類型、分析等方面的知識。
  • 功能和集成測試:請務必儘量嚴密地複製生產環境,以便:

    • 查找僅在使用特定版本的數據庫服務器時纔出現的問題。
    • 在升級 EF Core 和其餘依賴項時捕獲中斷性變動。 例如,添加或升級 ASP.NET Core、OData 或 Automapper 等框架。 這些依賴項可能以多種意外方式影響 EF Core。
  • 經過表明性負載進行性能和壓力測試。 某些功能的不成熟用法縮放性不佳。 例如,多項集合包含內容、大量使用延遲加載、對未編制索引的列執行條件查詢、對存儲生成的值進行大規模更新和插入、缺少併發處理、大型模型、緩存策略不充分。
  • 安全評審:例如,鏈接字符串和其餘機密處理、非部署操做的數據庫權限、原始 SQL 的輸入驗證、敏感數據加密。
  • 確保日誌記錄和診斷充足且可用。 例如,適當的日誌記錄配置、查詢標記和 Application Insights。
  • 錯誤恢復。 爲常見故障場景(如版本回退、回退服務器、橫向擴展和負載平衡、DoS 緩解和數據備份)準備應急計劃。
  • 應用程序部署和遷移。 規劃如何在部署過程當中應用遷移;在應用程序啓動時執行此操做可能會致使併發問題,而且對於常規操做,這所需的權限比必要權限更高。 在遷移期間,使用暫存來輔助從錯誤中恢復。 有關詳細信息,請參閱應用遷移。
  • 生成的遷移的詳細檢查和測試。 將遷移應用於生產數據前,應對其進行全面測試。 若表中包含生產數據,架構的形狀和列類型就不能輕易更改。 例如,在 SQL Server 上,對於映射到字符串和十進制屬性的列,nvarchar(max) 和 decimal(18, 2) 極少成爲最佳類型,但這些是 EF 使用的默認值,由於 EF 不瞭解你的具體狀況。

    博主GitHub地址

    https://github.com/yuyue5945

關注公衆號不迷路

公衆號~~~~

相關文章
相關標籤/搜索