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 Core 是流行的 Entity Framework 資料存取技術的開放原始碼、輕量級及可擴充版本。 它的設計可跨平台運作,支援各種現有的資料庫伺服器供應商,包括 SQL Server、SQLite、MySQL、PostgreSQL、Azure Cosmos DB 等。 EF Core 是現代的物件資料庫映射器,遵循 ORM (Object-Relational Mapping) 模式,讓開發人員可以使用 .NET 物件來處理資料庫,省去手動撰寫繁瑣的 SQL 查詢。
EF Core 的主要功能
1.Modeling Entities: EF Core 可讓開發人員使用 Plain Old CLR Objects (POCO) 定義資料模型。 這些實體類代表資料庫表,其屬性對應到表列。
2.LINQ 支援: EF Core 無縫支援 LINQ 查詢(語言整合查詢),讓開發人員可以使用熟悉的 C# 語法針對 SQL Server 或任何其他資料庫撰寫強式類型查詢。 這可讓查詢資料變得直覺,並降低運行時出錯的可能性。 此外,原始 SQL 語句可與 LINQ 查詢一起使用。
3.資料庫遷移:管理資料庫模式變更可能具有挑戰性,尤其是在團隊環境中。 EF Core 透過提供資料庫轉移功能簡化了這個過程,讓開發人員可以使用程式碼優先移轉功能對資料庫結構描述套用增量變更。
4.懶惰載入與急切載入: EF Core 支援懶惰載入與急切載入兩種策略,讓開發人員可以依據使用情況,按需或提前載入相關資料,以最佳化效能。
5.交易管理:交易可確保資料庫作業期間的資料一致性和完整性。 EF Core 可讓開發人員明確地處理事務,確保一組資料庫作業同時成功或失敗。
6.Concurrency Control: EF Core 提供了管理並發衝突的內建支援,讓開發人員可以偵測並解決當多位使用者嘗試同時修改相同資料時可能產生的衝突。
開始使用 EF Core
讓我們建立一個在 ASP.NET Core 應用程式中使用 SQLite 與 Entity Framework Core (EF Core) 的基本範例。 步驟如下
1.創建您的應用程式:
- 從建立 Console 或 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"); } }Imports Microsoft.EntityFrameworkCore Public Class DatabaseContext Inherits DbContext Protected Overrides Sub OnConfiguring(optionsBuilder As DbContextOptionsBuilder) optionsBuilder.UseSqlite("Filename=sample.db") End Sub End Class$vbLabelText $csharpLabel
4.註冊上下文:
-
在你的
Startup類別中,將你的上下文加入服務:public void ConfigureServices(IServiceCollection services) { services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>(); }public void ConfigureServices(IServiceCollection services) { services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>(); }Public Sub ConfigureServices(services As IServiceCollection) services.AddEntityFrameworkSqlite().AddDbContext(Of DatabaseContext)() End Sub$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(); } }Public Sub New(env As IHostingEnvironment) Using client As New DatabaseContext() client.Database.EnsureCreated() End Using End Sub$vbLabelText $csharpLabel
6.在您的應用程式中使用 SQLite:
- 現在您可以透過 EF Core 在 ASP.NET Core 應用程式中使用 SQLite。
- 定義你的模型,並使用
DatabaseContext與資料庫互動。
請記住,這只是一個基本範例,還有其他設定連線字串和使用 EF Core 的方法。 請隨意探索更先進的功能,並根據您的特定需求進行調整!
EF 核心開發的最佳實務
1.Keep DbContext Scoped: EF Core 中的 DbContext 實例被設計為短暫存在,通常應在 Web 應用程式中的單一要求的生命週期內使用。
2.對唯讀操作使用 AsNoTracking:當執行唯讀操作且不希望修改實體時,使用 AsNoTracking 方法繞過更改追蹤以提高效能。
3.優化查詢:透過使用適當的索引、分頁和過濾技術來撰寫有效率的查詢,以盡量減少從資料庫擷取的資料量。
4.避免 N+1 查詢問題:請注意 N+1 查詢問題,即針對集合中的每個相關實體執行查詢。 使用急切載入或顯式載入來有效率地取得相關資料。
5.監控效能:使用 Entity Framework Profiler 等工具或內建的日誌功能監控 EF Core 效能,以找出並解決效能瓶頸。
IronPDF 簡介

IronPDF for .NET 是一款功能強大的 C# PDF 函式庫,可讓您在 .NET 專案中產生、編輯 PDF 文件,並從 PDF 文件中抽取內容。 以下是一些主要特點:
-
HTML 轉 PDF:
- 將 HTML、CSS 及 JavaScript 內容轉換為 PDF 格式。
- 使用 Chrome Rendering Engine 繪製像素完美的 PDF。
- 從 URL、HTML 檔案或 HTML 字串產生 PDF。
2.圖片和內容轉換:
- 將圖像轉換成 PDF 或從 PDF 轉換成 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 建立一個 Console 應用程式,如下所示。

提供專案名稱。

提供 .NET 跨平台版本。

安裝 Microsoft.EntityFrameworkCore 套件。

安裝 Microsoft.EntityFrameworkCore.SqlLite 套件。
。
安裝 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; }
}
}
Imports IronPdf
Imports Microsoft.EntityFrameworkCore
Imports System
Imports System.Linq
Namespace CodeSample
Public Class Program
Public Shared Sub Main()
Console.WriteLine("-------------Demo EF core and IronPDF--------------")
' Disable local disk access or cross-origin requests
Installation.EnableWebSecurity = True
' Instantiate Renderer
Dim renderer = New ChromePdfRenderer()
' Start with initial HTML content
Dim content = "<h1>Demo EF core and IronPDF</h1>"
content += "<h2>Add Students</h2>"
' Add Students to Database
Using client = New DatabaseContext()
client.Database.EnsureCreated() ' Create table if it doesn't exist
client.Students.ExecuteDelete() ' Ensure the table is clean
' Define students
Dim students = {
New Student With {.StudentName = "Bill", .DateOfBirth = New DateTime(1990, 12, 1), .Height = 5.45D, .Weight = 56, .Grade = 10},
New Student With {.StudentName = "Mike", .DateOfBirth = New DateTime(1992, 12, 6), .Height = 4.45D, .Weight = 34, .Grade = 8},
New Student With {.StudentName = "Peter", .DateOfBirth = New DateTime(1990, 12, 3), .Height = 5.0D, .Weight = 50, .Grade = 10},
New Student With {.StudentName = "Bob", .DateOfBirth = New DateTime(1990, 12, 9), .Height = 4.56D, .Weight = 56, .Grade = 10},
New Student With {.StudentName = "Harry", .DateOfBirth = New DateTime(1990, 12, 21), .Height = 5.6D, .Weight = 56, .Grade = 10},
New Student With {.StudentName = "Charle", .DateOfBirth = New DateTime(1993, 12, 11), .Height = 5.5D, .Weight = 56, .Grade = 7}
}
' Add students to database
client.Students.AddRange(students)
client.SaveChanges()
' Add students info to HTML content
For Each student In students
content = AddStudent(content, student)
Next
End Using
content += "<h2>Display Students in Database</h2>"
' Display Students in Database
Using client = New DatabaseContext()
Console.WriteLine("Displaying Students in Database:")
Dim students = client.Students.ToList()
For Each student In students
Console.WriteLine($"Name= {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={student.Height}")
content = AddStudent(content, student)
Next
End Using
' Render HTML content to PDF
Dim pdf = renderer.RenderHtmlAsPdf(content)
' Export to a file or stream
pdf.SaveAs("AwesomeEfCoreAndIronPdf.pdf")
End Sub
' Helper method to add student info as HTML content
Private Shared Function AddStudent(content As String, student As Student) As String
content += $"<p Name = {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={student.Height}</p>"
Return content
End Function
End Class
Public Class DatabaseContext
Inherits DbContext
Public Property Students As DbSet(Of Student)
Protected Overrides Sub OnConfiguring(optionsBuilder As DbContextOptionsBuilder)
optionsBuilder.UseSqlite("Filename=IronPdfDemo.db")
End Sub
End Class
Public Class Student
Public Property StudentID As Integer
Public Property StudentName As String
Public Property DateOfBirth As DateTime?
Public Property Height As Decimal
Public Property Weight As Single
Public Property Grade As Integer
End Class
End Namespace
程式碼解釋
1.設定渲染器與內容:
- 程式碼首先建立一個 HTML 內容字串,其中包含標題 (
<h1>) 和副標題 (<h2>),用於將學生新增至資料庫。 - 目標是使用 IronPDF 產生 PDF 文件,其中將包含學生的相關資訊。
2.資料庫上下文與新增學生:
DatabaseContext類別用於與資料庫互動。client.Database.EnsureCreated();確保資料庫和表格存在。client.Students.ExecuteDelete();清除Students表中所有現有資料。- 定義學生並將其加入資料庫。 這些屬性包括
StudentName、DateOfBirth、Height、Weight和Grade。 client.SaveChanges();將變更儲存到資料庫。
3.展示學生:
- 此程式碼檢索所有使用
client.Students.ToList();的學生。 - 對於每個學生,它會列印出他們的姓名、ID、年級、體重和身高,並將這些資訊加入 HTML 內容。
4.渲染為 PDF:
- 實例化
ChromePdfRenderer。 - HTML 內容使用
renderer.RenderHtmlAsPdf(content)渲染成 PDF。 - 最後,PDF 會儲存為 "AwesomeEfCoreAndIronPDF.pdf"。
輸出


IronPDF 授權。
IronPDF 套件需要授權才能執行和產生 PDF。 在存取套件之前,在應用程式的開頭加入以下程式碼。
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
Imports IronPdf
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY"
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提供資料庫遷移功能,允許開發人員利用code-first遷移以累加方式對資料庫架構進行更改,確保資料庫結構與應用程式的資料模型對齊。
使用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 Licensing Page獲得。
EF Core如何支持資料查詢?
EF Core支持LINQ查詢,允許開發人員使用C#語法撰寫強類型查詢。它還允許執行原始SQL語句以進行更複雜的資料操作。
如何在.NET應用程式中開始使用EF Core?
要開始使用EF Core,請設置一個Console或ASP.NET應用程式,安裝必要的NuGet套件,如Microsoft.EntityFrameworkCore,定義資料模型,配置資料庫連接,並創建DbContext以管理資料操作。



