跳至页脚内容
.NET 帮助

Entity Framework Core(开发者用法)

在现代软件开发领域,有效的数据管理至关重要。 无论您是在构建简单应用程序还是复杂的企业系统,高效地访问、操作和保存数据都是一个基本要求。 C#中的Entity Framework Core(EF Core)是一个强大的工具,它通过提供一种方便的、面向对象的方法来简化数据访问以处理数据库。 在本文中,我们将深入探讨EF Core的世界,探索其功能、能力和最佳实践。 Also, we will have a look at IronPDF for Handling PDF Documents from Iron Software Solutions to read, write, and manage PDF documents. 我们将创建一个结合这两个软件包的实际例子。

理解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或任何其他数据库编写强类型查询。 这使得查询数据直观并减少运行时错误的可能性。 此外,可以与LINQ查询一起使用原始SQL语句。

  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. 创建您的数据库上下文

    • 定义一个继承自DbContext的数据库上下文类(例如,DatabaseContext)。
    • 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
      $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(ByVal 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();
       }
      }
      '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
      $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转换图像。
    • 从现有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; }
    }
}
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, 01),
						.Height = 5.45D,
						.Weight = 56,
						.Grade = 10
					},
					New Student With {
						.StudentName = "Mike",
						.DateOfBirth = New DateTime(1992, 12, 06),
						.Height = 4.45D,
						.Weight = 34,
						.Grade = 8
					},
					New Student With {
						.StudentName = "Peter",
						.DateOfBirth = New DateTime(1990, 12, 03),
						.Height = 5.0D,
						.Weight = 50,
						.Grade = 10
					},
					New Student With {
						.StudentName = "Bob",
						.DateOfBirth = New DateTime(1990, 12, 09),
						.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 student
			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 student
			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(ByVal content As String, ByVal 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(ByVal 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
$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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

可以从获得试用许可证。

结论

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 内容生成 PDF 文档,包括由 EF Core 管理的数据库中的数据。此组合可以在 .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 以管理数据操作。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。