跳過到頁腳內容
.NET HELP

Entity Framework Core (How It Works For Developers)

在現代軟體開發領域,高效的數據管理至關重要。 無論你建立的是簡單的應用程式還是複雜的企業系統,有效地存取、操作和保存資料都是基本要求。 C# 中的 Entity Framework Core (EF Core) 是一個強大的工具,它透過提供方便的物件導向方法來處理資料庫,從而簡化了資料存取。 在本文中,我們將深入探索 EF Core 的世界,以了解其特性、功能和最佳實踐。 此外,我們還將了解Iron Software Solutions提供的IronPDF for Handling PDF Documents,用於讀取、寫入和管理 PDF 文件。 我們將使用這兩個軟體包來建立一個實際範例。

理解實體框架核心

Entity Framework Core 是流行的 Entity Framework 資料存取技術的開源、輕量級和可擴充版本。 它被設計為跨平台運行,支援各種現有的資料庫伺服器供應商,包括 SQL Server、SQLite、MySQL、PostgreSQL、Azure Cosmos DB 等。 EF Core 是一個現代物件資料庫映射器,遵循 ORM(物件關聯映射)模式,允許開發人員使用 .NET 物件操作資料庫,從而無需手動編寫繁瑣的 SQL 查詢。

EF Core 的主要特性

1.建模實體: EF Core 使開發人員能夠使用普通舊 CLR 物件 (POCO) 定義資料模型。 這些實體類別代表資料庫表,其屬性對應到表列。

  1. LINQ 支援: EF Core 無縫支援 LINQ 查詢(語言整合查詢),允許開發人員使用熟悉的 C# 語法對 SQL Server 或任何其他資料庫編寫強類型查詢。 這使得資料查詢更加直觀,並降低了運行時出錯的可能性。 此外,原始 SQL 語句也可以與 LINQ 查詢一起使用。

3.資料庫遷移:管理資料庫架構變更可能具有挑戰性,尤其是在團隊環境中。 EF Core 透過提供資料庫遷移功能簡化了這個過程,讓開發人員可以使用程式碼優先遷移對資料庫模式進行增量變更。

4.延遲載入和預先載入: EF Core 支援延遲載入和預先載入策略,使開發人員能夠根據用例按需或預先載入相關資料來最佳化效能。

5.事務管理:事務確保資料庫操作期間資料的一致性和完整性。 EF Core 允許開發人員明確地處理事務,確保一組資料庫操作要么一起成功,要么一起失敗。

6.並發控制: EF Core 提供了對管理並發衝突的內建支持,允許開發人員檢測和解決多個使用者同時嘗試修改相同資料時可能出現的衝突。

EF Core 入門

讓我們建立一個在 ASP.NET Core 應用程式中使用 SQLite 和 Entity Framework Core (EF Core) 的基本範例。 以下是步驟:

1.創建您的應用程式:

首先建立一個控制台應用程式或 ASP.NET 應用程式。

2.安裝必要的軟體包:

  • 將以下 NuGet 套件新增至您的專案:

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

3.建立資料庫上下文:

  • 為你的資料庫上下文定義一個類別(例如, DatabaseContext ),該類別繼承自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");
         }
     }
    $vbLabelText   $csharpLabel

4.註冊上下文:

  • 在你的Startup類別中,將你的上下文加入到服務中:

     public void ConfigureServices(IServiceCollection services)
     {
         services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>();
     }
     public void ConfigureServices(IServiceCollection services)
     {
         services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>();
     }
    $vbLabelText   $csharpLabel

5.啟動時建立資料庫:

  • 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();
         }
     }
    $vbLabelText   $csharpLabel

6.在您的應用程式中使用 SQLite:

  • 現在您可以透過 EF Core 在 ASP.NET Core 應用程式中使用 SQLite。
  • 定義你的模型並使用DatabaseContext與資料庫互動。

請記住,這是一個基本範例,還有其他方法可以配置連接字串並使用 EF Core。 歡迎探索更多進階功能,並根據您的具體需求進行調整!

EF Core 開發的最佳實踐

1.保持 DbContext 的作用域: EF Core 中的 DbContext 實例設計為生命週期較短,通常應將其作用域限定在 Web 應用程式中單一請求的生命週期內。

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 字串產生 PDF。

2.圖片和內容轉換:

  • 將影像轉換為 PDF 格式,反之亦然。
  • 從現有 PDF 文件中提取文字和圖像。
  • 支援多種影像格式。

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 IronPdf;
using Microsoft.EntityFrameworkCore;
using System;
using System.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();

            // Start with initial HTML content
            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 if it doesn't exist
                client.Students.ExecuteDelete(); // Ensure the table is clean

                // Define students
                var students = new[]
                {
                    new Student { StudentName = "Bill", DateOfBirth = new DateTime(1990, 12, 01), Height = 5.45M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Mike", DateOfBirth = new DateTime(1992, 12, 06), Height = 4.45M, Weight = 34, Grade = 8 },
                    new Student { StudentName = "Peter", DateOfBirth = new DateTime(1990, 12, 03), Height = 5.0M, Weight = 50, Grade = 10 },
                    new Student { StudentName = "Bob", DateOfBirth = new DateTime(1990, 12, 09), Height = 4.56M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Harry", DateOfBirth = new DateTime(1990, 12, 21), Height = 5.6M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Charle", DateOfBirth = new DateTime(1993, 12, 11), Height = 5.5M, Weight = 56, Grade = 7 }
                };

                // Add students to database
                client.Students.AddRange(students);
                client.SaveChanges();

                // Add students info to HTML content
                foreach (var student in students)
                {
                    content = AddStudent(content, student);
                }
            }

            content += "<h2>Display Students in Database</h2>";

            // Display Students in Database
            using (var client = new DatabaseContext())
            {
                Console.WriteLine($"Displaying Students in Database:");
                var students = client.Students.ToList();

                foreach (var student in students)
                {
                    Console.WriteLine($"Name= {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={student.Height}");
                    content = AddStudent(content, student);
                }
            }           

            // Render HTML content to PDF
            var pdf = renderer.RenderHtmlAsPdf(content);

            // Export to a file or stream
            pdf.SaveAs("AwesomeEfCoreAndIronPdf.pdf");
        }

        // Helper method to add student info as HTML content
        private static string AddStudent(string content, Student student)
        {
            content += $"<p>Name = {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={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 IronPdf;
using Microsoft.EntityFrameworkCore;
using System;
using System.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();

            // Start with initial HTML content
            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 if it doesn't exist
                client.Students.ExecuteDelete(); // Ensure the table is clean

                // Define students
                var students = new[]
                {
                    new Student { StudentName = "Bill", DateOfBirth = new DateTime(1990, 12, 01), Height = 5.45M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Mike", DateOfBirth = new DateTime(1992, 12, 06), Height = 4.45M, Weight = 34, Grade = 8 },
                    new Student { StudentName = "Peter", DateOfBirth = new DateTime(1990, 12, 03), Height = 5.0M, Weight = 50, Grade = 10 },
                    new Student { StudentName = "Bob", DateOfBirth = new DateTime(1990, 12, 09), Height = 4.56M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Harry", DateOfBirth = new DateTime(1990, 12, 21), Height = 5.6M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Charle", DateOfBirth = new DateTime(1993, 12, 11), Height = 5.5M, Weight = 56, Grade = 7 }
                };

                // Add students to database
                client.Students.AddRange(students);
                client.SaveChanges();

                // Add students info to HTML content
                foreach (var student in students)
                {
                    content = AddStudent(content, student);
                }
            }

            content += "<h2>Display Students in Database</h2>";

            // Display Students in Database
            using (var client = new DatabaseContext())
            {
                Console.WriteLine($"Displaying Students in Database:");
                var students = client.Students.ToList();

                foreach (var student in students)
                {
                    Console.WriteLine($"Name= {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={student.Height}");
                    content = AddStudent(content, student);
                }
            }           

            // Render HTML content to PDF
            var pdf = renderer.RenderHtmlAsPdf(content);

            // Export to a file or stream
            pdf.SaveAs("AwesomeEfCoreAndIronPdf.pdf");
        }

        // Helper method to add student info as HTML content
        private static string AddStudent(string content, Student student)
        {
            content += $"<p>Name = {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={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; }
    }
}
$vbLabelText   $csharpLabel

程式碼解釋

1.設定渲染器和內容:

程式碼首先建立一個帶有標題的 HTML 內容字串(<h1> )和副標題(<h2>用於向資料庫新增學生。

  • 目標是使用 IronPDF 產生 PDF 文檔,其中包含有關學生的資訊。

2.資料庫上下文及新增學生:

  • DatabaseContext類別用於與資料庫進行互動。
  • client.Database.EnsureCreated();確保資料庫和表格存在。
  • client.Students.ExecuteDelete();清除Students表中的所有現有資料。
  • 學生資訊已定義並新增至資料庫。 屬性包括StudentNameDateOfBirthHeightWeightGrade
  • client.SaveChanges();將變更儲存到資料庫。

3.展示學生:

  • 程式碼使用client.Students.ToList();檢索所有學生;
  • 它會列印每個學生的姓名、ID、年級、體重和身高,並將這些資訊加入 HTML 內容中。

4.渲染為 PDF:

  • ChromePdfRenderer已實例化。
  • 使用renderer.RenderHtmlAsPdf(content)將 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";
$vbLabelText   $csharpLabel

您可以從IronPDF 許可頁面取得試用許可證。

結論

C# 中的 Entity Framework Core 提供了一種強大而直觀的方式來與資料庫交互,開箱即用地提供了 LINQ 支援、資料庫遷移和交易管理等功能。 透過遵循最佳實踐並利用其強大的功能,開發人員可以輕鬆建立可擴展且易於維護的應用程式。 無論您是經驗豐富的開發人員還是剛入門的新手,EF Core 都是您在 C# 應用程式中進行現代資料存取的工具包中不可或缺的寶貴工具。 另一方面,IronPDF 是一個 .NET 程式庫,用於在應用程式中建立、操作和渲染 PDF 文件。 您可以將其與 EF Core 一起使用,將 HTML 內容(包括圖像)轉換為 PDF 檔案。

常見問題解答

Entity Framework Core 是什麼?

Entity Framework Core (EF Core) 是一種開放原始碼、輕量級的 ORM (Object-Relational Mapping) 工具,可讓開發人員使用 .NET 物件與資料庫進行互動,省去手動 SQL 查詢,從而簡化資料存取。

如何在 .NET 專案中將 HTML 內容轉換為 PDF?

您可以使用 IronPDF for .NET 這個 .NET 函式庫,將 HTML 內容(包括從資料庫擷取的資料)轉換成 PDF 檔案。它允許在 C# 應用程式中無縫整合資料處理與文件產生。

EF Core 如何處理資料庫遷移?

EF Core 提供資料庫遷移功能,可讓開發人員使用代碼先行遷移功能,對資料庫模式進行增量變更,確保資料庫結構與應用程式的資料模型保持一致。

在 EF Core 中使用 lazy loading 和 eager loading 有什麼好處?

懶惰載入和急切載入是 EF Core 優化資料擷取效能的策略。懶惰載入會依需求載入相關資料,而急切載入則會事先擷取相關資料,以減少所需的查詢次數。

EF Core 如何管理交易?

EF Core 支援明確的事務管理,可確保一系列資料庫作業不是全部成功就是全部失敗,從而在整個過程中維持資料的一致性和完整性。

使用 EF Core 有哪些最佳實務?

EF Core 的最佳實作包括:將 DbContext 實例的範圍維持在單一要求上、對唯讀作業使用 AsNoTracking 以改善效能、最佳化查詢,以及避免 N+1 查詢問題。

IronPDF 如何與 EF Core 搭配使用?

IronPDF 可與 EF Core 搭配使用,從 HTML 內容產生 PDF 文件,包括來自 EF Core 管理的資料庫的資料。這種組合可在 .NET 應用程式中實現高效的資料管理和文件生成。

在專案中使用 .NET 函式庫來產生 PDF 需要哪些條件?

要使用 IronPDF,您需要透過 NuGet 安裝 IronPDF 套件,並擁有有效的授權金鑰。您可從 IronPdf 授權頁面取得試用授權。

EF Core 如何支援資料查詢?

EF Core 支援 LINQ 查詢,讓開發人員可以使用 C# 語法撰寫強式類型的查詢。它還可以執行原始 SQL 語句,以進行更複雜的資料作業。

如何在 .NET 應用程式中開始使用 EF Core?

要開始使用 EF Core,請設定 Console 或 ASP.NET 應用程式,安裝必要的 NuGet 套件,例如 Microsoft.EntityFrameworkCore,定義資料模型,設定資料庫連線,並建立 DbContext 以管理資料作業。

Jacob Mellor,技術長 @ Team Iron
首席技術長

Jacob Mellor 是 Iron Software 的首席技術長,也是開創 C# PDF 技術的有遠見的工程師。作為 Iron Software 核心程式碼庫背後的原始開發人員,他從公司成立之初就塑造了公司的產品架構,與首席執行官 Cameron Rimington 一起將公司轉型為一家 50 多人的公司,為 NASA、Tesla 和全球政府機構提供服務。

Jacob 持有曼徹斯特大學土木工程一級榮譽工程學士學位 (BEng)(1998-2001 年)。

Jacob 於 1999 年在倫敦開設了他的第一家軟體公司,並於 2005 年創建了他的第一個 .NET 元件,之後,他專門解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF & Iron Suite for .NET 函式庫在全球的 NuGet 安裝量已超過 3000 萬次,他的基礎程式碼持續為全球使用的開發人員工具提供動力。Jacob 擁有 25 年的商業經驗和 41 年的編碼專業知識,他一直專注於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代的技術領導者。