跳至页脚内容
.NET 帮助

Entity Framework Core(开发者用法)

在现代软件开发领域,有效的数据管理至关重要。 无论您是在构建简单应用程序还是复杂的企业系统,高效地访问、操作和保存数据都是一个基本要求。 C#中的Entity Framework Core(EF Core)是一个强大的工具,它通过提供一种方便的、面向对象的方法来简化数据访问以处理数据库。 在本文中,我们将深入探讨EF Core的世界,探索其功能、能力和最佳实践。 此外,我们还将看看 IronPDF 用于处理 PDF 文档,来自 Iron Software Solutions,用于读取、写入和管理 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或任何其他数据库编写强类型查询。 这使得查询数据直观并减少运行时错误的可能性。 此外,可以与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.创建数据库上下文:

  • 为你的数据库上下文定义一个类(例如,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 Core开发的最佳实践

  1. 使DbContext作用域化: 在EF Core中,DbContext实例的设计是短期的,通常应在Web应用程序中单独请求的生命周期内进行作用域化。

2.对只读操作使用 AsNoTracking:当执行只读操作且不希望修改实体时,使用 AsNoTracking 方法绕过更改跟踪以提高性能。

  1. 优化查询: 通过使用适当的索引、分页和过滤技术编写高效查询,以最小化从数据库检索的数据量。

  2. 避免N+1查询问题: 注意N+1查询问题,其中为集合中的每个相关实体执行查询。 使用立即加载或显式加载来有效获取相关数据。

  3. 监控性能: 使用如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, 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
$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
    • HTML 内容使用 renderer.RenderHtmlAsPdf(content) 渲染成 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";
Imports IronPdf

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 内容生成 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 以管理数据操作。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

Jacob 拥有曼彻斯特大学土木工程一级荣誉工程学士学位(BEng)(1998-2001 年)。他的旗舰产品 IronPDF 和 Iron Suite for .NET 库在全球的 NuGet 安装量已超过 3000 万次,其基础代码继续为全球使用的开发人员工具提供动力。Jacob 拥有 25 年的商业经验和 41 年的编码专业知识,他一直专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我