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的关键功能
-
建模实体: EF Core允许开发人员使用简单的旧CLR对象(POCOs)定义数据模型。 这些实体类代表数据库表,其属性映射到表列。
-
LINQ支持: EF Core无缝支持LINQ查询(语言集成查询),允许开发人员使用熟悉的C#语法针对SQL Server或任何其他数据库编写强类型查询。 这使得查询数据直观并减少运行时错误的可能性。 此外,可以与LINQ查询一起使用原始SQL语句。
-
数据库迁移: 管理数据库架构更改可能具有挑战性,特别是在团队环境中。 EF Core通过提供数据库迁移能力简化了这个过程,让开发人员可以使用代码优先迁移应用数据库架构的增量更改。
-
延迟加载和立即加载: EF Core支持延迟加载和立即加载策略,使开发人员可以根据使用情况通过按需或提前加载相关数据来优化性能。
-
事务管理: 事务确保数据在数据库操作期间的一致性和完整性。 EF Core允许开发人员显式处理事务,确保一组数据库操作一起成功或失败。
-
并发控制: 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。 -
在
OnConfiguring方法中,设置SQLite连接字符串:public class DatabaseContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Filename=sample.db"); } }Public Class DatabaseContext Inherits DbContext Protected Overrides Sub OnConfiguring(optionsBuilder As DbContextOptionsBuilder) optionsBuilder.UseSqlite("Filename=sample.db") End Sub End ClassPublic Class DatabaseContext Inherits DbContext Protected Overrides Sub OnConfiguring(optionsBuilder As DbContextOptionsBuilder) optionsBuilder.UseSqlite("Filename=sample.db") End Sub End Class
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 SubPublic Sub ConfigureServices(services As IServiceCollection) services.AddEntityFrameworkSqlite().AddDbContext(Of DatabaseContext)() End Sub
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 SubPublic Sub New(env As IHostingEnvironment) Using client As New DatabaseContext() client.Database.EnsureCreated() End Using End Sub
6.在您的应用程序中使用 SQLite:
- 现在,您可以通过EF Core在ASP.NET Core应用程序中使用SQLite。
- 定义您的模型并使用
DatabaseContext与数据库交互。
请记住,这是一个基本示例,还有其他方法可配置连接字符串并使用EF Core。 请随时探索更高级的功能并根据具体需求进行调整!
EF Core开发的最佳实践
-
使DbContext作用域化: 在EF Core中,DbContext实例的设计是短期的,通常应在Web应用程序中单独请求的生命周期内进行作用域化。
-
使用AsNoTracking进行只读操作: 在执行只读操作时,使用
AsNoTracking方法,通过绕过变更跟踪来提高性能。 -
优化查询: 通过使用适当的索引、分页和过滤技术编写高效查询,以最小化从数据库检索的数据量。
-
避免N+1查询问题: 注意N+1查询问题,其中为集合中的每个相关实体执行查询。 使用立即加载或显式加载来有效获取相关数据。
-
监控性能: 使用如Entity Framework Profiler或内置日志记录功能等工具监控EF Core性能,以识别和解决性能瓶颈。
IronPDF简介

IronPDF是一个强大的C# PDF库,允许您在.NET项目中生成、编辑和提取PDF文档的内容。 以下是一些关键功能:
-
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 创建一个控制台应用程序,如下所示。

提供项目名称。

提供.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 NamespaceImports 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代码解释
-
设置渲染器和内容:
- 代码首先创建一个包含标题(
<h2>)的HTML内容字符串,用于添加学生到数据库。 - 目标是使用IronPDF生成一个PDF文档,其中将包括关于学生的信息。
- 代码首先创建一个包含标题(
-
数据库上下文和添加学生:
DatabaseContext类用于与数据库交互。client.Database.EnsureCreated();确保数据库和表的存在。Students表中任何现有的数据。- 学生被定义并添加到数据库中。 属性包括
Grade。 client.SaveChanges();将更改保存到数据库。
-
显示学生:
- 代码通过
client.Students.ToList();检索所有学生。 - 对于每位学生,打印他们的姓名、ID、成绩、体重和身高,并将这些信息添加到HTML内容中。
- 代码通过
-
渲染为PDF:
ChromePdfRenderer被实例化。- 使用
renderer.RenderHtmlAsPdf(content)将HTML内容渲染成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"Imports IronPdf
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY"可以从 IronPDF License Page 获得试用许可证。
结论
C#中的Entity Framework Core提供了一种强大且直观的方式来与数据库交互,提供了诸如LINQ支持、数据库迁移和事务管理等功能。 通过遵循最佳实践并利用其强大的功能,开发人员可以轻松构建可扩展和可维护的应用程序。 无论您是一名经验丰富的开发人员还是刚入门,EF Core都是C#应用程序现代数据访问工具包中的一件有价值的工具。 另一方面,IronPDF是一个.NET库,用于在您的应用程序中创建、操纵和呈现PDF文档。 您可以将其与EF Core一起使用,将HTML内容(包括图像)转换为PDF文件。
Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。