.NET 帮助

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

发布 2024年八月13日
分享:

介绍

在现代软件开发领域,高效的数据管理至关重要。无论是构建一个简单的应用程序还是复杂的企业系统,有效地访问、操作和保存数据都是基本要求。Entity Framework Core (EF 核心) 在C#中是一个强大的工具,通过提供方便的面向对象的方法来简化数据访问。在本文中,我们将深入探讨EF Core的世界,探索其功能、能力和最佳实践。此外,我们还将看看 IronPDF铁软件(Iron Software) 读取、编写和管理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通过提供数据库迁移功能简化了这一过程,使开发人员能够使用代码优先迁移对数据库模式进行增量更改。

  4. 惰性加载和急加载: EF Core支持惰性加载和急加载策略,使开发人员可以根据使用情况按需或预先加载相关数据,从而优化性能。

  5. 事务管理: 事务确保数据库操作期间数据的一致性和完整性。EF Core允许开发人员显式地处理事务,确保一组数据库操作要么一起成功,要么一起失败。

  6. 并发控制: EF Core提供内置支持来管理并发冲突,允许开发人员检测并解决当多个用户同时尝试修改相同数据时可能出现的冲突。

开始使用 EF Core

让我们创建一个使用 SQLite 和 Entity Framework Core 的基本示例 (EF 核心) 在ASP.NET Core应用程序中。以下是步骤:

  1. 创建您的应用程序

    • 从创建一个控制台或ASP.Net应用程序开始。
  2. 安装必要的软件包

    • 向您的项目添加以下NuGet包:

      • Microsoft.EntityFrameworkCore (1.0.0 或更高版本)

      • Microsoft.EntityFrameworkCore.Sqlite (1.0.0 或更高版本)
    1. 创建您的数据库上下文
  • 为您的数据库上下文定义一个类 (例如,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
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 实例设计为短生命周期,通常应限定为 Web 应用程序中单个请求的生命周期。

  2. 对只读操作使用 AsNoTracking: 当执行不需要修改实体的只读操作时,使用 AsNoTracking 方法通过绕过更改跟踪来提高性能。

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

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

  5. 监控性能: 使用 like 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 标准 (2.0+)和 .NET Framework (4.6.2+).

      • 兼容 Windows、Linux 和 macOS。
    • 可在 NuGet 上轻松安装。

使用IronPDF和EF Core生成PDF文档

首先,使用Visual Studio创建一个控制台应用程序,如下所示。

实体框架核心(开发者如何使用):图2 - 新项目

提供项目名称。

Entity Framework Core(开发人员如何工作):图3 - 项目配置

提供跨平台的 .NET 版本。

实体框架核心(它如何为开发人员工作):图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
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。

      * 使用 renderer.RenderHtmlAsPdf 将 HTML 内容渲染为 PDF。(内容)最后,PDF保存为“AwesomeEfCoreAndIronPdf.pdf”。

## 输出

![实体框架核心(它如何为开发者工作):图 8 - 控制台输出](/static-assets/pdf/blog/entity-framework-core/entity-framework-core-8.webp)

### PDF

![Entity Framework Core(开发人员是如何使用的):图 9 - PDF 输出](/static-assets/pdf/blog/entity-framework-core/entity-framework-core-9.webp)

## IronPDF 许可

IronPDF 软件包需要许可证才能运行并生成 PDF。在访问软件包之前,请在应用程序的开头添加以下代码。

```cs
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
client.SaveChanges
```()将更改保存到数据库。

3. **显示学生:**

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

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

      * 对于每个学生,打印他们的姓名、ID、成绩、体重和身高。

    * 另外,调用 AddStudent 函数 (未显示在此代码片段中).

  4. **渲染为 PDF:** 

      * 实例化 ChromePdfRenderer。

      * 使用 renderer.RenderHtmlAsPdf 将 HTML 内容渲染为 PDF。(内容)最后,PDF保存为“AwesomeEfCoreAndIronPdf.pdf”。

## 输出

![实体框架核心(它如何为开发者工作):图 8 - 控制台输出](/static-assets/pdf/blog/entity-framework-core/entity-framework-core-8.webp)

### PDF

![Entity Framework Core(开发人员是如何使用的):图 9 - PDF 输出](/static-assets/pdf/blog/entity-framework-core/entity-framework-core-9.webp)

## IronPDF 许可

IronPDF 软件包需要许可证才能运行并生成 PDF。在访问软件包之前,请在应用程序的开头添加以下代码。

```cs
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
client.SaveChanges ```()将更改保存到数据库。 3. **显示学生:** * 然后,代码显示数据库中的学生。 * 它使用 `client.Students.ToList` 检索所有学生。()
## 输出
### PDF
## IronPDF 许可
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'. * 对于每个学生,打印他们的姓名、ID、成绩、体重和身高。 * 另外,调用 AddStudent 函数(未显示在此代码片段中). 4. **渲染为 PDF:** * 实例化 ChromePdfRenderer。 * 使用 renderer.RenderHtmlAsPdf 将 HTML 内容渲染为 PDF。(内容)最后,PDF保存为"AwesomeEfCoreAndIronPdf.pdf”。 ![实体框架核心(它如何为开发者工作):图 8 - 控制台输出](/static-assets/pdf/blog/entity-framework-core/entity-framework-core-8.webp) ![Entity Framework Core(开发人员是如何使用的):图 9 - PDF 输出](/static-assets/pdf/blog/entity-framework-core/entity-framework-core-9.webp) IronPDF 软件包需要许可证才能运行并生成 PDF。在访问软件包之前,请在应用程序的开头添加以下代码。 ```cs IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
VB   C#

试用许可证可用 这里.

结论

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

< 前一页
AutoFixture C#(开发者如何使用)
下一步 >
FluentEmail C#(开发者如何使用)

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,840,061 查看许可证 >