.NET 幫助

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

發佈 2024年8月13日
分享:

介紹

在現代軟體開發領域,有效的數據管理至關重要。 無論您是在構建一個簡單的應用程式還是複雜的企業系統,能夠有效地存取、操作和保存資料都是一個基本的要求。 Entity Framework Core(EF Core)在 C# 中,是一個強大的工具,透過提供便捷且面向物件的方法來簡化資料存取,讓與資料庫的互動更加容易。 在本文中,我們將深入探討EF Core的世界,探索其功能、能力和最佳實踐。 此外,我們將查看IronPDF 用於處理 PDF 文件IronSoftware 解決方案讀取、編寫和管理 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 透過提供資料庫遷移功能來簡化此過程,允許開發人員使用 Code-First 遷移對資料庫架構進行增量更改。

  4. 延遲加載和積極加載: EF Core 支援延遲加載和積極加載兩種策略,使開發人員能根據使用案例,通過按需或事先加載相關數據來優化性能。

  5. 交易管理: 交易在資料庫操作過程中確保資料的一致性和完整性。 EF Core 允許開發者明確地處理交易,確保一組資料庫操作要麼一起成功,要麼一起失敗。

  6. 並發控制: EF Core 提供內建功能來管理並發衝突,使開發人員能夠檢測和解決當多個用戶同時嘗試修改相同數據時可能出現的衝突。

開始使用 EF Core

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

  1. 創建您的應用程式

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

    • 將以下 NuGet 套件添加到您的專案中:

      • Microsoft.EntityFrameworkCore(1.0.0 版或更高版本)
      • Microsoft.EntityFrameworkCore.Sqlite(1.0.0 版或更高版本)
  3. 建立您的資料庫上下文

    • 為您的資料庫上下文定義一個類別(例如,資料庫上下文)從 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。
    • 從 URLs、HTML 檔案或 HTML 字串生成 PDF。
  2. 圖片和內容轉換

    • 將圖像轉換為 PDF 或從 PDF 轉換圖像。

    • 從現有的 PDF 中提取文字和圖片。
    • 支援各種影像格式。
  3. 編輯和操作

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

    • 新增數位簽章。
    • 編輯元數據和修訂歷史。
  4. 跨平台支持

    • 適用於 .NET Core(8, 7, 6, 5, 和 3.1+).NET 標準(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 函數(此程式碼片段中未顯示).
  4. 渲染為 PDF:

    • ChromePdfRenderer已實例化。

    • HTML內容是使用renderer.RenderHtmlAsPdf渲染成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#

試用授權可從IronPDF 授權頁面.

結論

C# 中的 Entity Framework Core 提供了一種強大且直觀的方式與資料庫互動,並內建提供像是 LINQ 支援、資料庫遷移以及交易管理等功能。 通過遵循最佳實踐並利用其強大的功能,開發人員可以輕鬆構建可擴展且可維護的應用程式。 無論您是經驗豐富的開發人員還是剛入門的初學者,EF Core 都是您工具組中一個寶貴的工具,用於在 C# 應用程式中進行現代資料存取。 另一方面,IronPDF 是一個 .NET 程式庫,用於在應用程式中建立、操作和呈現 PDF 文件。 您可以配合 EF Core 來轉換 HTML 內容(包含圖片)轉換為 PDF 文件。

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

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

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >