.NET 帮助

实体框架核心(开发者如何使用)

介绍

在现代软件开发领域,高效的数据管理至关重要。 无论是构建简单的应用程序还是复杂的企业系统,有效地访问、操作和保存数据都是一项基本要求。 Entity Framework Core(EF Core)在C#中是一种强大的工具,通过提供方便的面向对象的方法来简化数据库访问。 在本文中,我们将深入了解 EF Core 的世界,探索其特性、功能和最佳实践。 此外,我们将查看来自Iron Software SolutionsIronPDF 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)定义数据模型。 这些实体类表示数据库表,其属性映射到表列。

  2. 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");
            }
        }
Public Class DatabaseContext
	Inherits DbContext

			Protected Overrides Sub OnConfiguring(ByVal optionsBuilder As DbContextOptionsBuilder)
				optionsBuilder.UseSqlite("Filename=sample.db")
			End Sub
End Class
$vbLabelText   $csharpLabel
  1. 注册上下文

    • 在您的 "启动 "类中,为服务添加您的上下文:
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
  1. 在启动时创建数据库

    • 在启动构造函数中,创建您的数据库:
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
  1. 在您的应用程序中使用SQLite

    • 现在,您可以通过 EF Core 在 ASP.NET Core 应用程序中使用 SQLite。
    • 定义模型并使用 DatabaseContext 与数据库交互。

    请记住,这只是一个基本示例,还有其他配置连接字符串和使用 EF Core 的方法。 欢迎探索更多高级功能并根据您的具体需求进行调整!

EF 核心开发的最佳实践

  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 - 新项目

提供项目名称。

实体框架核心(开发人员如何使用):图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 软件包。

实体框架核心(开发者如何使用):图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
$vbLabelText   $csharpLabel

代码解释

  1. 设置渲染器和内容:

    • 代码首先要创建一个 HTML 内容字符串。 它以标题

      开头,并添加了一个小标题

      ,用于将学生添加到数据库中。

    • 目标似乎是使用 IronPDF 生成 PDF 文档,其中将包括学生信息。
  2. 数据库上下文和添加学生:

    • DatabaseContext 类用于与数据库交互。

    • client.Database.EnsureCreated(); 确保数据库表存在。

    • client.Students.ExecuteDelete(); 清除学生表中的任何现有数据。

    • 创建了一个新学生(stud1),具有诸如StudentName、DateOfBirth、Height、Weight和Grade等属性。

    • client.Students.Add(stud1); 将该学生添加到数据库中。
    • client.SaveChanges(); 将更改保存到数据库。
  3. 显示学生:

    • 然后,代码将显示数据库中的学生。

    • 它使用 client.Students.ToList(); 检索所有学生。

    • 对于每个学生,它都会打印出他们的姓名、身份证号、年级、体重和身高。
    • 此外,AddStudent函数被调用(此代码片段中未显示)。
  4. 渲染为PDF:

    • ChromePdfRenderer 已实例化。

    • HTML内容通过renderer.RenderHtmlAsPdf(content)被渲染为PDF。
    • 最后,将 PDF 保存为 "AwesomeEfCoreAndIronPdf.pdf"。

输出

实体框架核心(它是如何为开发者工作的):图 8 - 控制台输出

PDF

实体框架核心(开发者如何使用):图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

试用许可证可在IronPDF许可证页面获取。

结论

C# 中的 Entity Framework Core 提供了与数据库交互的强大而直观的方式,提供了诸如 LINQ 支持、数据库迁移和开箱即用的事务管理等功能。 通过遵循最佳实践并利用其强大的功能,开发人员可以轻松构建可扩展、可维护的应用程序。 无论您是经验丰富的开发人员还是刚刚入门,EF Core 都是您工具包中的宝贵工具,可用于 C# 应用程序中的现代数据访问。 另一方面,IronPDF 是一个 .NET 库,用于在应用程序中创建、操作和渲染 PDF 文档。 您可以将其与EF Core一起使用,将HTML内容(包括图像)转换为PDF文件。

Chipego
软件工程师
Chipego 拥有出色的倾听技巧,这帮助他理解客户问题并提供智能解决方案。他在 2023 年加入 Iron Software 团队,此前他获得了信息技术学士学位。IronPDF 和 IronOCR 是 Chipego 主要专注的两个产品,但他对所有产品的了解每天都在增长,因为他不断找到支持客户的新方法。他喜欢 Iron Software 的合作氛围,公司各地的团队成员贡献他们丰富的经验,以提供有效的创新解决方案。当 Chipego 离开办公桌时,你经常可以发现他在看书或踢足球。
< 前一页
AutoFixture C#(开发者如何使用)
下一步 >
FluentEmail C#(开发者如何使用)