.NET 幫助

Entity Framework Core(它是如何為開發者工作的)

發佈 2024年8月13日
分享:

介紹

在現代軟體開發領域,有效的資料管理至關重要。無論您是在構建一個簡單的應用程式還是一個複雜的企業系統,高效地存取、操作和儲存資料都是基本的要求。Entity Framework Core (EF Core) 在 C# 中, 是一個強大的工具,透過提供方便且面向物件的方法來簡化資料存取。在本文中,我們將深入探討 EF Core 的世界,探索其功能、能力和最佳實踐。此外,我們還將一覽 IronPDFIronSoftware 讀取、寫入和管理 PDF 文件。我們將使用這兩個套件創建一個實際示例。

理解 Entity Framework Core

Entity Framework Core 是一個開源、輕量且可擴展版的流行資料存取技術 Entity Framework。其設計旨在跨平台工作,支持包括 SQL Server、SQLite、MySQL、PostgreSQL、Azure Cosmos DB 等在內的多種現有數據庫伺服器提供者。EF Core 是一個現代對象數據庫映射器,並遵循 ORM。 (物件關聯對應) 模式,允許開發人員使用 .NET 物件操作資料庫,從而消除了手動編寫繁瑣的 SQL 查詢的需要。

EF Core的主要功能

  1. 建模實體: EF Core 使開發人員能夠使用舊式 CLR 對象來定義數據模型 (POCOs). 這些實體類別代表資料庫表格,屬性對應至表格欄位。

  2. LINQ 支援: EF Core 無縫支援 LINQ 查詢 (語言集成查詢),允許開發人員使用熟悉的 C# 語法對 SQL Server 或任何其他資料庫進行強型別查詢。這使得查詢數據變得直觀並減少運行時錯誤的可能性。此外,還可以將原生 SQL 語句與 LINQ 查詢一起使用。

  3. 數據庫遷移: 管理數據庫模式變更可能具有挑戰性,尤其是在團隊環境中。EF Core 通過提供數據庫遷移功能簡化了這一過程,允許開發人員使用程式碼優先遷移方法對數據庫模式進行增量更改。

  4. 延遲加載和急載: EF Core 支持延遲加載和急載策略,使開發人員能夠根據使用情況按需或預先加載相關數據,從而優化性能。

  5. 交易管理: 交易在數據庫操作期間確保數據的一致性和完整性。EF Core 允許開發人員明確地使用交易,確保一組數據庫操作要麼一起成功,要麼一起失敗。

  6. 並發控制: EF Core 提供了內建的並發衝突管理支持,允許開發人員檢測並解決同時有多個用戶試圖修改相同數據時可能出現的衝突。

開始使用 EF Core

讓我們創建一個使用 SQLite 與 Entity Framework Core 的基本範例 (EF Core) 在 ASP.NET Core 應用程序中。步驟如下:

  1. 創建您的應用程序

    • 首先創建一個控制台或 ASP.Net 應用程序。
  2. 安裝必要的套件

    • 將以下 NuGet 套件添加到您的項目中:

      • Microsoft.EntityFrameworkCore (1.0.0 版或更高版本)

      • Microsoft.EntityFrameworkCore.Sqlite (1.0.0 版或更高版本)
    1. 建立您的資料庫上下文
  • 定義一個資料庫上下文的類別 (例如,資料庫上下文) 繼承自 DbContext。

在 OnConfiguring 方法中,設置 SQLite 連接字串:

public class DatabaseContext : DbContext
        {
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlite("Filename=sample.db");
            }
        }
public class DatabaseContext : DbContext
        {
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlite("Filename=sample.db");
            }
        }
Public Class DatabaseContext
	Inherits DbContext

			Protected Overrides Sub OnConfiguring(ByVal optionsBuilder As DbContextOptionsBuilder)
				optionsBuilder.UseSqlite("Filename=sample.db")
			End Sub
End Class
VB   C#
  1. 註冊上下文:

    • 在你的Startup類別中,將上下文新增到服務中:
public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>();
        }
public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>();
        }
Public Sub ConfigureServices(ByVal services As IServiceCollection)
			services.AddEntityFrameworkSqlite().AddDbContext(Of DatabaseContext)()
End Sub
VB   C#
  1. 在啟動時創建數據庫

    • 在 Startup 構造函數中,創建您的數據庫:
public Startup(IHostingEnvironment env)
        {
            using (var client = new DatabaseContext())
            {
                client.Database.EnsureCreated();
            }
        }
public Startup(IHostingEnvironment env)
        {
            using (var client = new DatabaseContext())
            {
                client.Database.EnsureCreated();
            }
        }
'INSTANT VB WARNING: The following constructor is declared outside of its associated class:
'ORIGINAL LINE: public Startup(IHostingEnvironment env)
Public Sub New(ByVal env As IHostingEnvironment)
			Using client = New DatabaseContext()
				client.Database.EnsureCreated()
			End Using
End Sub
VB   C#
  1. 在您的應用程式中使用SQLite

      * 現在,您可以透過 EF Core 在您的 ASP.NET Core 應用程式中使用 SQLite。

      * 定義您的模型並使用 DatabaseContext 與資料庫互動。

請記住,這是一個基本範例,還有其他方式來配置連接字串並使用 EF Core。隨時探索更高級的功能並根據您的具體需求進行調整。!

EF Core 開發最佳實踐

  1. 將 DbContext 設置為範圍: 在 EF Core 中,DbContext 實例設計為短暫的,應該通常範圍限定於網頁應用程式中的一次請求生命週期。

  2. 針對只讀操作使用 AsNoTracking: 當執行只讀操作時,不期望實體被修改,使用 AsNoTracking 方法可通過繞過變更跟踪來提高性能。

  3. 優化查詢: 通過使用適當的索引、分頁和過濾技術來撰寫高效的查詢,減少從資料庫檢索的數據量。

  4. 避免 N+1 查詢問題: 注意 N+1 查詢問題,這是指對集合中的每個相關實體執行一次查詢。使用積極加載或顯式加載來高效地獲取相關數據。

  5. 監控性能: 使用 Entity Framework Profiler 等工具或內建日誌記錄能力來監控 EF Core 性能,以識別並解決性能瓶頸。

IronPDF 介紹

Entity Framework Core(它如何為開發者工作):圖 1 - IronPDF

IronPDF 是一個強大的 C# PDF 庫,允許在 .NET 專案中生成、編輯和提取 PDF 文件的內容。以下是一些主要功能:

  1. HTML 到 PDF 轉換

    • 將 HTML、CSS 和 JavaScript 內容轉換為 PDF 格式。

    • 使用 Chrome 渲染引擎生成像素完美的 PDF。

    • 從 URL、HTML 文件或 HTML 字串生成 PDFs。
  2. 圖像和內容轉換

    • 圖像與 PDF 之間的轉換。

    • 從現有的 PDFs 提取文本和圖像。

    • 支援各種圖像格式。
  3. 編輯和操作

    • 設定 PDF 的屬性、安全性和權限。

    • 添加數字簽名。

    • 編輯元數據和修訂歷史。
  4. 跨平臺支援

    • 支援 .NET Core。 (8, 7, 6, 5, 和 3.1+).NET Standard (2.0+),和 .NET Framework (4.6.2+).

      • 兼容 Windows、Linux 和 macOS。
    • 可在 NuGet 上獲取,方便安裝。

使用IronPDF和EF Core生成PDF文件

首先,使用Visual Studio创建如下的控制台應用程式。

Entity Framework Core(開發者使用方式):圖 2 - 新專案

提供專案名稱。

Entity Framework Core(為開發人員服務的工作原理):圖 3 - 專案配置

提供 .NET 跨平台版本。

Entity Framework Core(適用於開發者的使用方式):圖4 - 框架

安裝 Microsoft.EntityFrameworkCore 套件。

Entity Framework Core(如何運作於開發者):圖5 - Microsoft.EntityFrameworkCore套件

安裝 Microsoft.EntityFrameworkCore.SqlLite 套件。

Entity Framework Core(開發人員使用方式):圖6 - Microsoft.EntityFrameworkCore.SqlLite 套件

安裝IronPDF套件。

Entity Framework Core(它如何為開發人員工作):圖7 - IronPDF

Program.cs 中添加以下程式碼。

using Microsoft.EntityFrameworkCore;
using System.Xml.Linq;
namespace CodeSample
{
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine("-------------Demo EF core and IronPDF--------------");
            // Disable local disk access or cross-origin requests
            Installation.EnableWebSecurity = true;
            // Instantiate Renderer
            var renderer = new ChromePdfRenderer();
            var content = "<h1>Demo EF core and IronPDF</h1>";
            content += "<h2>Add Students</h2>";
            // Add Students to Database
            using (var client = new DatabaseContext())
            {
                client.Database.EnsureCreated(); // create table
                client.Students.ExecuteDelete(); // ensure clean table
                var stud1 = new Student { StudentName = "Bill", DateOfBirth = new DateTime(1990, 12, 01), Height = 5.45M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud1);
                var stud2 = new Student { StudentName = "Mike", DateOfBirth = new DateTime(1992, 12, 06), Height = 4.45M, Weight = 34, Grade = 8 };
                content = AddStudent(content, stud2);
                var stud3 = new Student { StudentName = "Peter", DateOfBirth = new DateTime(1990, 12, 03), Height = 5.0M, Weight = 50, Grade = 10 };
                content = AddStudent(content, stud3);
                var stud4 = new Student { StudentName = "Bob", DateOfBirth = new DateTime(1990, 12, 09), Height = 4.56M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud4);
                var stud5 = new Student { StudentName = "Harry", DateOfBirth = new DateTime(1990, 12, 21), Height = 5.6M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud5);
                var stud6 = new Student { StudentName = "Charle", DateOfBirth = new DateTime(1993, 12, 11), Height = 5.5M, Weight = 56, Grade = 7 };
                content = AddStudent(content, stud6);
                client.Students.Add(stud1);
                client.Students.Add(stud2);
                client.Students.Add(stud3);
                client.Students.Add(stud4);
                client.Students.Add(stud5);
                client.Students.Add(stud6);
                client.SaveChanges();
            }
            content += "<h2>Display Students in Database</h2>";
            // Display Students in Database
            using (var client = new DatabaseContext())
            {
                Console.WriteLine($"Display Stduents in Database");
                var students = client.Students.ToList();
                foreach (var student in students)
                {
                    Console.WriteLine($"Name= {student.StudentName},ID={student.StudentID},G={student.Grade},W={student.Weight},H={student.Height}");
                    content = AddStudent(content, student);
                }
            }           
            var pdf = renderer.RenderHtmlAsPdf(content);
            // Export to a file or Stream
            pdf.SaveAs("AwesomeEfCoreAndIronPdf.pdf");
        }
        private static string AddStudent(string content, Student student)
        {
            content += $"<p>Name = {student.StudentName},ID={student.StudentID},G={student.Grade},W={student.Weight},H={student.Height}</p>";
            return content;
        }
    }
    public class DatabaseContext : DbContext
    {
        public DbSet<Student> Students { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Filename=IronPdfDemo.db");
        }        
    }
    public class Student
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public DateTime? DateOfBirth { get; set; }
        public decimal Height { get; set; }
        public float Weight { get; set; }
        public int Grade { get; set; }
    }
}
using Microsoft.EntityFrameworkCore;
using System.Xml.Linq;
namespace CodeSample
{
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine("-------------Demo EF core and IronPDF--------------");
            // Disable local disk access or cross-origin requests
            Installation.EnableWebSecurity = true;
            // Instantiate Renderer
            var renderer = new ChromePdfRenderer();
            var content = "<h1>Demo EF core and IronPDF</h1>";
            content += "<h2>Add Students</h2>";
            // Add Students to Database
            using (var client = new DatabaseContext())
            {
                client.Database.EnsureCreated(); // create table
                client.Students.ExecuteDelete(); // ensure clean table
                var stud1 = new Student { StudentName = "Bill", DateOfBirth = new DateTime(1990, 12, 01), Height = 5.45M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud1);
                var stud2 = new Student { StudentName = "Mike", DateOfBirth = new DateTime(1992, 12, 06), Height = 4.45M, Weight = 34, Grade = 8 };
                content = AddStudent(content, stud2);
                var stud3 = new Student { StudentName = "Peter", DateOfBirth = new DateTime(1990, 12, 03), Height = 5.0M, Weight = 50, Grade = 10 };
                content = AddStudent(content, stud3);
                var stud4 = new Student { StudentName = "Bob", DateOfBirth = new DateTime(1990, 12, 09), Height = 4.56M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud4);
                var stud5 = new Student { StudentName = "Harry", DateOfBirth = new DateTime(1990, 12, 21), Height = 5.6M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud5);
                var stud6 = new Student { StudentName = "Charle", DateOfBirth = new DateTime(1993, 12, 11), Height = 5.5M, Weight = 56, Grade = 7 };
                content = AddStudent(content, stud6);
                client.Students.Add(stud1);
                client.Students.Add(stud2);
                client.Students.Add(stud3);
                client.Students.Add(stud4);
                client.Students.Add(stud5);
                client.Students.Add(stud6);
                client.SaveChanges();
            }
            content += "<h2>Display Students in Database</h2>";
            // Display Students in Database
            using (var client = new DatabaseContext())
            {
                Console.WriteLine($"Display Stduents in Database");
                var students = client.Students.ToList();
                foreach (var student in students)
                {
                    Console.WriteLine($"Name= {student.StudentName},ID={student.StudentID},G={student.Grade},W={student.Weight},H={student.Height}");
                    content = AddStudent(content, student);
                }
            }           
            var pdf = renderer.RenderHtmlAsPdf(content);
            // Export to a file or Stream
            pdf.SaveAs("AwesomeEfCoreAndIronPdf.pdf");
        }
        private static string AddStudent(string content, Student student)
        {
            content += $"<p>Name = {student.StudentName},ID={student.StudentID},G={student.Grade},W={student.Weight},H={student.Height}</p>";
            return content;
        }
    }
    public class DatabaseContext : DbContext
    {
        public DbSet<Student> Students { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Filename=IronPdfDemo.db");
        }        
    }
    public class Student
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public DateTime? DateOfBirth { get; set; }
        public decimal Height { get; set; }
        public float Weight { get; set; }
        public int Grade { get; set; }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

代碼說明

  1. 設置渲染器和內容:

    • 代碼首先創建了一個 HTML 內容字符串。它以標題

      開始,並添加副標題

      用於將學生添加到數據庫中。

    • 目標似乎是使用 IronPDF 生成包含有關學生信息的 PDF 文件。
  2. 數據庫上下文和添加學生:

    • DatabaseContext 類用於與數據庫交互。

    • client.Database.EnsureCreated(); 確保資料庫表存在。

      • client.Students.ExecuteDelete(); 清除 Students 資料表中的任何現有數據。
    • 一個新生 (stud1) 是用屬性創建的,例如 StudentName、DateOfBirth、Height、Weight 和 Grade。
    • client.Students.Add(stud1); 將此學生新增到資料庫中。

    • client.SaveChanges(); 將更改保存到資料庫。
  3. 顯示學生:

    • 接著程式碼將顯示資料庫中的學生。
    • 使用 client.Students.ToList 檢索所有學生。();.
    • 對於每個學生,它會打印他們的名字、ID、成績、體重和身高。
    • 此外,還會調用 AddStudent 函數 (此程式碼片段中未顯示).
    1. 渲染為PDF:

      • 實例化ChromePdfRenderer。
      • 使用renderer.RenderHtmlAsPdf將HTML內容渲染為PDF。(內容).
      • 最後,PDF 會被保存為「AwesomeEfCoreAndIronPdf.pdf」。

輸出

Entity Framework Core(適用於開發人員的工作原理):圖 8 - 主控台輸出

PDF

Entity Framework Core(開發人員如何使用):圖9 - PDF輸出

IronPDF 授權

IronPDF 套件需要授權才能運行及生成 PDF。請在應用程式開始時加入以下程式碼,然後再存取該套件。

IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

試用許可證可用 這裡.

結論

Entity Framework Core 在 C# 提供了一種強大且直觀的方式來與數據庫交互,提供了如 LINQ 支持、數據庫遷移和事務管理等特性。通過遵循最佳實踐並利用其強大的功能,開發人員可以輕鬆構建可擴展且易於維護的應用程式。無論你是一名經驗豐富的開發人員還是剛剛起步,EF Core 都是你工具箱中一個寶貴的工具,用於現代數據訪問 C# 應用程式。另一方面,IronPDF 是一個 .NET 庫,用於在你的應用程式中創建、操作和渲染 PDF 文檔。你可以將它與 EF Core 一起使用來轉換 HTML 內容。 (包含圖片) 到 PDF 文件中。

< 上一頁
AutoFixture C#(開發人員的工作方式)
下一個 >
FluentEmail C#(開發人員如何使用)

準備開始了嗎? 版本: 2024.10 剛剛發布

免費 NuGet 下載 總下載次數: 10,993,239 查看許可證 >