跳至頁尾內容
.NET 幫助

Entity Framework Core(開發者使用指南)

在現代軟體開發領域,高效的數據管理至關重要。 無論你建立的是簡單的應用程式還是複雜的企業系統,有效地存取、操作和保存資料都是基本要求。 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(物件關係映射)工具,它允許開發人員使用 .NET 物件與資料庫交互,從而簡化資料訪問,無需手動執行 SQL 查詢。

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

您可以使用 IronPDF(一個 .NET 程式庫)將 HTML 內容(包括從資料庫擷取的資料)轉換為 PDF 檔案。它支援在 C# 應用程式中無縫整合資料處理和文件生成。

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

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

在 EF Core 中使用延遲載入和預載有什麼好處?

在 EF Core 中,延遲載入和預先載入是優化資料檢索效能的兩種策略。延遲載入按需載入相關數據,而預載則預先檢索相關數據,從而減少所需的查詢次數。

EF Core 如何管理事務?

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

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

EF Core 的最佳實務包括將 DbContext 實例的作用域限制在單一請求內,對唯讀操作使用 AsNoTracking 以提高效能,最佳化查詢,以及避免 N+1 查詢問題。

IronPDF 如何與 EF Core 結合?

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

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

要使用 IronPDF,您需要透過 NuGet 安裝 IronPDF 程式包並擁有有效的許可證密鑰。您可以從 IronPDF 許可頁面取得試用許可證。

EF Core 如何支援資料查詢?

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

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

要開始使用 EF Core,請設定控制台或 ASP.NET 應用程序,安裝必要的 NuGet 套件(如 Microsoft.EntityFrameworkCore),定義資料模型,配置資料庫連接,並建立 DbContext 來管理資料操作。

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

Jacob Mellor 是 Iron Software 的首席技術官,也是一位富有遠見的工程師,率先開發了 C# PDF 技術。作為 Iron Software 核心程式碼庫的最初開發者,他自公司成立之初便參與塑造了其產品架構,並與執行長 Cameron Rimington 一起將其發展成為一家擁有 50 多名員工、服務於 NASA、特斯拉和全球政府機構的公司。

Jacob 於 1998 年至 2001 年在曼徹斯特大學獲得土木工程一級榮譽學士學位。 1999 年,他在倫敦創辦了自己的第一家軟體公司;2005 年,他創建了自己的第一個 .NET 元件。此後,他專注於解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。