Entity Framework Core (EF Core) 10 的新特性

目录

[安装 Entity Framework Core](#安装 Entity Framework Core)

[LINQ 和 SQL 转换增强](#LINQ 和 SQL 转换增强)

[支持 Azure Cosmos DB 上的全文搜索](#支持 Azure Cosmos DB 上的全文搜索)

支持混合搜索

[支持 LeftJoin 和 RightJoin 运算符](#支持 LeftJoin 和 RightJoin 运算符)

[在 Azure Cosmos DB 上演化模型时增强支持](#在 Azure Cosmos DB 上演化模型时增强支持)

增强对映射存储过程的支持

[支持在 ExecuteUpdateAsync 方法中使用非表达式 Lambda](#支持在 ExecuteUpdateAsync 方法中使用非表达式 Lambda)

[安装 Entity Framework Core 10](#安装 Entity Framework Core 10)

[ASP.NET Core 10 中的新特性和增强功能](#ASP.NET Core 10 中的新特性和增强功能)

[在 Visual Studio 2022 预览版中创建新的 ASP.NET Core 10 项目](#在 Visual Studio 2022 预览版中创建新的 ASP.NET Core 10 项目)

Blazor增强功能

[将表单提交中的空字符串转换为可空值类型的 Null 值](#将表单提交中的空字符串转换为可空值类型的 Null 值)

[支持使用 IOpenApiDocumentProvider 接口访问 OpenAPI 文档](#支持使用 IOpenApiDocumentProvider 接口访问 OpenAPI 文档)

[改进 ASP.NET Core OpenAPI 文档生成](#改进 ASP.NET Core OpenAPI 文档生成)

[支持使用 System.Text.Json 的 JSON Patch](#支持使用 System.Text.Json 的 JSON Patch)

[增强对 OpenAPI XML 文档的支持](#增强对 OpenAPI XML 文档的支持)

[支持在 Transformers 中生成 OpenAPI Schema](#支持在 Transformers 中生成 OpenAPI Schema)

[支持 JavaScript 互操作以调用构造函数和属性](#支持 JavaScript 互操作以调用构造函数和属性)

[对最小 API 中验证的支持](#对最小 API 中验证的支持)

[增强对服务器发送事件 (SSE) 的支持](#增强对服务器发送事件 (SSE) 的支持)

[支持为 API 控制器指定响应描述](#支持为 API 控制器指定响应描述)

身份验证和授权增强功能

[RedirectHttpResult.IsLocalUrl 辅助方法](#RedirectHttpResult.IsLocalUrl 辅助方法)

[WPF 10 的新特性](#WPF 10 的新特性)

[Windows Forms 10 的新功能](#Windows Forms 10 的新功能)

摘要

基准测试


Entity Framework Core (EF Core) 是微软推出的一款跨平台、轻量级、可扩展的对象关系映射器 (ORM),它简化了数据库操作。Entity Framework Core (EF Core) 10 包含多项新特性和增强功能,例如:

  • LINQ 和 SQL 转换增强
  • 支持 Azure Cosmos DB 上的全文搜索
  • 支持混合搜索
  • 支持 LeftJoin 和 RightJoin 运算符
  • 在 Azure Cosmos DB 上演化模型时提供增强支持
  • 增强对映射存储过程的支持
  • ExecuteUpdateAsync在方法中支持非表达式 lambda

上一篇:https://blog.csdn.net/hefeng_aspnet/article/details/156082567

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

安装 Entity Framework Core

在使用 EF Core 之前,需要先通过 NuGet 将其安装到项目中。要安装使用 Entity Framework Core 和 SQL Server 所需的 NuGet 包,请将这些包安装到项目中,右键单击解决方案,然后选择"管理解决方案的 NuGet 程序包..."

窗口弹出后,搜索要添加到项目中的 NuGet 包。为此,请在 NuGet 包管理器屏幕的搜索框中输入名为 `<package_name>` Microsoft.EntityFrameworkCore, Microsoft.EntityFrameworkCore.Design、` <package_name>`Microsoft.EntityFrameworkCore.Tools,和`<package_name>` 的包Microsoft.EntityFrameworkCore.SqlServer,然后依次安装它们。

或者,您也可以在 NuGet 包管理器命令提示符下键入以下命令:

PM> Install-Package Microsoft.EntityFrameworkCore

PM> Install-Package Microsoft.EntityFrameworkCore.Design

PM> Install-Package Microsoft.EntityFrameworkCore.Tools

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer

您也可以通过在 Windows Shell 中执行以下命令来安装这些软件包:

dotnet add package Microsoft.EntityFrameworkCore

dotnet add package Microsoft.EntityFrameworkCore.Design

dotnet add package Microsoft.EntityFrameworkCore.Tools

dotnet add package Microsoft.EntityFrameworkCore.SqlServer

LINQ 和 SQL 转换增强

在 EF Core 10 中,LINQ 查询优化了执行,并最大限度地减少了冗余的数据库调用,从而改进了索引机制。查询编译器优化方面的新变化增加了 LINQ 表达式的更高效转换,从而加快了数据访问速度并改善了并发管理。

支持 Azure Cosmos DB 上的全文搜索

.NET 10 中,Azure Cosmos DB 引入了对 NoSQL 全文搜索的支持,从而实现了全面而高级的文本搜索。您可以将其与向量搜索结合使用,以提高某些 AI 用例的搜索精度。EF Core 10 对该功能的支持使得您可以对数据库进行建模,并启用全文搜索属性。

以下代码片段展示了如何在 EF Core 10 中配置全文搜索:

public class ApplicationDbContext

{

public ApplicationDbContext(DbContextOptions<ApplicationDbContext>

options) : base(options)

{

}

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity<Person>(b =>

{

b.Property(e => e.City).EnableFullTextSearch();

b.HasIndex(e => e.City).IsFullTextIndex();

});

}

}

假设全文搜索已经配置完成,可以使用以下代码片段在 EF Core 10 中利用全文搜索功能:

var data = await context.Persons

.Where(x => EF.Functions.FullTextContains(x.City, "Texas"))

.ToListAsync();

支持混合搜索

EF Core 10 支持向量相似度搜索和全文搜索相结合的方式(即混合搜索)。以下代码片段展示了如何使用混合搜索。

float[] vectorArray;

/* Assume that the vector array is populated with vector data

derived from text, image, etc. */

var hybrid = await context

.Persons

.OrderBy(x => EF.Functions.Rrf(

EF.Functions.FullTextScore(x.City, "database"),

EF.Functions.VectorDistance(x.Vector, vectorArray)

))

.Take(25)

.ToListAsync();

支持 LeftJoin 和 RightJoin 运算符

在之前的 EF Core 版本中,在 LINQ 操作中实现 LeftJoin 操作相当具有挑战性。而从 EF Core 10 开始,现在LINQ 中同时支持LeftJoin 和 RightJoin 操作。

以下查询展示了如何在 EF Core 10 中使用 LeftJoin 运算符:

var query = context.Payroll

.LeftJoin(

context.Department,

employee => employee.DepartmentID,

department => department.ID,

(employee, department) => new

{

employee.ID,

employee.FirstName,

employee.LastName,

employee.JoiningDate,

employee.EmailAddress,

Department = department.Name ?? ""

});

在 Azure Cosmos DB 上演化模型时增强支持

在 Azure Cosmos DB 中使用 EF Core 为实体添加新的必填属性时,会出现物化问题,因为 EF 无法物化该实体。这是因为文档是在更改之前创建的,所以 EF Core 无法获取这些值。要解决此问题,请先将该属性标记为可选,手动添加默认值,然后再进行所需的更改。

增强对映射存储过程的支持

借助 EF Core 10,您可以比以往更轻松地在存储过程中映射 CUD(创建、更新、删除)操作,从而实现更高效的数据管理。在此 EF Core 版本之前,运行存储过程需要执行许多步骤,非常耗时费力。

现在,您可以启用 EF Core,使其在处理 CUD 操作时利用存储过程,而不是生成 SQL 命令。以下代码片段展示了如何实现这一点:

modelBuilder.Entity<Person>()

.InsertUsingStoredProcedure("Employee_Insert", spe =>

{

spe.HasParameter(e => e.FirstName);

spe.HasResultColumn(e => e.Id);

})

.UpdateUsingStoredProcedure("Employe_Update", spe =>

{

spe.HasOriginalValueParameter(e => e.Id);

spe.HasParameter(e => e.FirstName);

spe.HasRowsAffectedResultColumn();

})

.DeleteUsingStoredProcedure("Employe_Delete", spe =>

{

spe.HasOriginalValueParameter(e => e.Id);

spe.HasRowsAffectedResultColumn();

});

在 EF Core 中,` InsertUsingStoredProcedureinsert` 、`update` 和 `delete` 方法UpdateUsingStoredProcedure以扩展方法的形式实现,它们调用底层数据库上相应的存储过程,用于在关系数据库中插入、更新和删除数据。通常,这些扩展方法在自定义 `DbContext` 类的 `get` 方法DeleteUsingStoredProcedure中使用。OnModelCreating

支持在 ExecuteUpdateAsync 方法中使用非表达式 Lambda

在最新版本的 EF Core 中,新引入的 ` ExecuteUpdateAsyncand`ExecuteDeleteAsync方法支持异步批量更新或删除操作。这些改进显著提升了可扩展性,尤其适用于管理海量数据的云应用。

在早期版本的 EF Core 中,该ExecuteUpdateAsync方法需要表达式树,这使得动态更新难以处理。EF Core 10ExecuteUpdateAsync增强了 LINQ 查询转换和该方法,从而实现了更灵活高效的数据库操作。EF Core 10 还支持在该方法中使用正则表达式(非表达式 lambda)ExecuteUpdateAsync

以下代码片段展示了 EF Core 10 如何支持使用正则 lambda 表达式,从而可以轻松地动态执行条件更新:

await context.Blogs.ExecuteUpdateAsync(s =>

{

if (isNameChanged)

{

s.SetProperty(a => a.FirstName, "Joydip");

s.SetProperty(a => a.LastName, "Kanjilal");

}

});

EF Core 10 中的其他一些改进包括支持一些以 char 为参数的字符串函数、支持在 SQLite 上使用 decimal 的 MAX/MIN/ORDER BY、将 COALESCE 转换为 ISNULL,以及将 AsyncLocal 替换为 ThreadId 以提高延迟加载器的性能。

安装 Entity Framework Core 10

安装使用 Entity Framework Core 和 SQL Server 所需的 NuGet 程序包。要将这些程序包安装到您的项目中,请右键单击解决方案,然后选择**"管理解决方案的 NuGet 程序包..."**。

现在,在搜索框中搜索名为 ` <packages_name>`Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.InMemory`<packages_name>` 的 NuGet 包,并依次安装它们。选择最新的 EF Core 发布版本,如图1所示。截至撰写本文时,最新的 EF Core 发布版本为 10.0.1。

图 1: NuGet 包管理器窗口

另一种方法是在 NuGet 包管理器命令提示符下键入以下命令:

PM> Install-Package Microsoft.EntityFrameworkCore -v 10.0.1

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer -v

10.0.1

或者,您也可以在 Windows Shell 中执行以下命令来安装这些软件包:

dotnet add package Microsoft.EntityFrameworkCore -v 10.0.1

dotnet add package Microsoft.EntityFrameworkCore.SqlServer -v 10.0.1

ASP.NET Core 10 中的新特性和增强功能

微软在 ASP.NET Core 10 中引入了 Blazor、SignalR、极简 API 和 OpenAPI 3.1 的多项增强功能。ASP.NET Core 10 承诺简化开发流程,与现代 Web 标准无缝集成,并相比之前的版本拥有更佳的性能。本节重点介绍 ASP.NET Core 10 中引入的新特性和增强功能:

  • Blazor增强功能
  • 将表单提交中的空字符串转换为可空值类型的 null 值
  • IOpenApiDocumentProvider支持使用接口访问 OpenApiDocument
  • 改进 ASP.NET Core OpenAPI 文档生成
  • 支持使用 JSON PatchSystem.Text.Json
  • 增强对 OpenAPI XML 文档的支持
  • 支持在转换器中生成 OpenAPI 模式
  • 支持 JavaScript 互操作
  • 支持在最小 API 中进行验证
  • 增强对服务器发送事件 (SSE) 的支持
  • 支持为 API 控制器指定响应描述
  • 身份验证和授权增强
  • 辅助RedirectHttpResult.IsLocalUrl方法

在深入探讨这些增强功能之前,我们先来学习如何在 Visual Studio 中创建一个新的 ASP.NET Core 10 项目。

在 Visual Studio 2022 预览版中创建新的 ASP.NET Core 10 项目

您可以通过多种方式在 Visual Studio 2022 中创建项目,例如通过 Visual Studio 2022 开发人员命令提示符或启动 Visual Studio 2022 IDE。启动 Visual Studio 2022 预览版时,您会看到"开始"窗口。您可以选择**"不编写代码继续"**来启动 Visual Studio 2022 预览版 IDE 的主屏幕。

现在您已经了解了基础知识,让我们开始设置项目。要在 Visual Studio 2022 中创建一个新的 ASP.NET Core 8 项目:

  1. 启动 Visual Studio 2022 IDE 预览版。
  2. 在"创建新项目" 窗口中,选择ASP.NET Core Web API,然后单击"下一步"继续。
  3. 在"配置新项目"窗口中,指定项目名称和创建路径。
  4. 如果您希望解决方案文件和项目创建在同一目录下,可以选择选中"将解决方案和项目放在同一目录下"复选框。单击"下一步"继续。
  5. 在下一个屏幕中,从相应的下拉控件中,将目标框架指定为**.NET 10.0(预览版)** ,并将身份验证类型指定为None 。
  6. 请确保"配置 HTTPS"、"启用 Docker 支持"、"不使用顶级语句"和"启用 OpenAPI 支持"复选框未选中,因为在本示例中您不会使用这些复选框。
  7. 请记住选中"使用控制器"复选框,因为本示例中不会使用最小 API。
  8. 点击"创建"完成该过程。

一个新的 ASP.NET Core Web API 项目已创建。您将在后续章节中使用此项目。

Blazor增强功能

Blazor 是微软推出的开源现代 Web 框架,它使开发人员能够使用 C# 和 .NET 创建交互式 Web 应用程序。它最初包含在 .NET 5 中,用于使用 C# 和 .NET 构建交互式 Web 应用程序。

ASP.NET Core 10 Blazor 中的组件QuickGrid现在包含一个 RowClass 参数,如下面的代码片段所示:

<QuickGrid Items="employee" RowClass="ApplyRowStyle">

<PropertyColumn Property="@(e => e.EmployeeId)" Sortable="true" />

<PropertyColumn Property="@(e => e.FirstName)" Sortable="true" />

<PropertyColumn Property="@(e => e.FirstName)" Sortable="true" />

<PropertyColumn Property="@(e => p.JoiningDate)" Format="yyyy-MM-dd"

Sortable="true" />

</QuickGrid>

此外,您还可以利用该CloseColumnOptionsAsync方法关闭QuickGrid列选项 UI,如下面的代码示例所示:

<QuickGrid @ref="employeeGrid"

Items="employees">

<PropertyColumn Property="@(e => e.City)"

Title="City">

<ColumnOptions>

<input type="search"

@bind="cityFilter"

placeholder="Filter by city"

@bind:after="@(() => employeeGrid.CloseColumnOptionsAsync())" />

</ColumnOptions>

</PropertyColumn>

<PropertyColumn Property="@(e => e.FirstName)"

Title="First Name" />

<PropertyColumn Property="@(e => e.LastName)"

Title="Last Name" />

<PropertyColumn Property="@(e => e.City)"

Title="City" />

</QuickGrid>

如果您使用 EF Core 将数据绑定到 Blazor 中的 QuickGrid 组件,请添加对Microsoft.AspNetCore.Components.QuickGrid.EntityFrameworkAdapterNuGet 包的引用。BlazorQuickGrid中的该组件能够解析返回 IQueryable 数据的查询。要使用此功能,请AddQuickGridEntityFrameworkAdapter在文件中调用服务集合上的相应方法Program.cs,如下面的代码片段所示:

builder.Services.AddQuickGridEntityFrameworkAdapter();

这样,您就可以注册一个符合 EF Core 规范的 IAsyncQueryExecutor 实现。清单 2 展示了如何QuickGridASP.NET Core Blazor 中使用该组件来绑定数据。

清单 2: 使用 QuickGrid 进行数据绑定

@page "/examplegrid"

@using Microsoft.AspNetCore.Components.QuickGrid

<h3>Demonstrating QuickGrid in ASP.NET Core Blazor</h3>

<QuickGrid Items="@people" TGridItem="Employee">

<PropertyColumn Property="@(employee => employee.Id)" Title="ID" />

<PropertyColumn Property="@(employee => employee.FirstName)"

Title="FirstName" />

<PropertyColumn Property="@(employee => employee.LastName)" Title="LastName" />

</QuickGrid>

@code {

public List<Employee> employee = new()

{

new Employee { Id = 1, FirstName = "Steve", LastName = "Smith" },

new Employee { Id = 2, FirstName = "Rex", LastName = "Wills" },

new Employee { Id = 3, FirstName = "Michelle", LastName = "Stevens" }

};

public class Employee {

public int Id { get; set; }

public string FirstName { get; set; }

public string LastName { get; set; }

}

}

在 .NET 10 中,Blazor Web 应用程序现在使用 Link 标头自动预加载框架静态资源,从而使 Web 浏览器能够在获取和渲染初始页面之前提前加载资源。独立的 Blazor WebAssembly 应用程序模板也已更新,允许预取状态框架资源以及生成的 JavaScript 导入映射。

将表单提交中的空字符串转换为可空值类型的 Null 值

ASP.NET Core 10 中使用最小 API 处理属性时[Form],表单提交操作中的空字符串值会被转换为 null,如下面的代码片段所示:

using Microsoft.AspNetCore.Http;

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.MapPost("/book",

([FromForm] Book book) => TypedResults.Ok(book));

app.Run();

public class Book

{

public int Id

{

get; set;

}

public DateOnly? PublicationDate

{

get; set;

}

public string Title

{

get; set;

}

}

请参考前面的代码片段。如果该字段为空,则其值PublicationDate将映射到null 。

支持使用 IOpenApiDocumentProvider 接口访问 OpenAPI 文档

在 .NET 10 中,ASP.NET Core 允许您使用依赖注入注入类型引用IOpenApiDocumentProvider。因此,现在可以在 HTTP 上下文之外(例如后台服务或自定义中间件)访问 OpenAPI 文档实例。以下代码片段展示了如何IOpenAPiDocumentProvider使用构造函数注入注入类型实例。

public class OrderService

(

IOpenAPiDocumentProvider openApiDocumentProvider

)

{

public async Task SomeMethod()

{

OpenApiDocument doc = await

openApiDocumentProvider.GetOpenApiDocumentAsync();

}

}

改进 ASP.NET Core OpenAPI 文档生成

ASP.NET Core 10 提供了对生成 OpenAPI 文档的支持,而 OpenAPI 文档又与 2020 年 12 月发布的 JSON Schema 草案规范保持一致。虽然这项改进使 API 文档的结构更清晰、更准确,但此版本也引入了一些变化。在 OpenAPI 3.1 中,可空属性使用**`type`** 关键字代替了**`nullable: true`**。此外,虽然您仍然可以使用 OpenAPI 3.0 生成文档,但 OpenAPI 3.1 现在被视为生成文档的默认版本。

您可以使用以下代码配置 OpenAPI 版本 3.0:

builder.Services.AddOpenApi(options =>

{

options.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0;

});

或者,也可以使用 MSBuild 选项指定相同的内容:

<OpenApiGenerateDocumentsOptions> --openapi-version OpenApi3_0

</OpenApiGenerateDocumentsOptions>

OpenAPI 3.1 的另一个关键变化是将 `<string>` 替换OpenApiAny为 `<string> JsonNode`。请看以下代码片段,它展示了如何OpenApiObject在早期版本的 .NET Core 中生成 OpenAPI 文档时使用 `<string>`:

options.AddSchemaTransformer((schema, context, cancellationToken) =>

{

if (context.JsonTypeInfo.Type == typeof(Employee))

{

schema.Example = new OpenApiObject

{

"joiningdate"\] = new OpenApiString( DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")), \["comments"\] = new OpenApiString("New Employee") }; } return Task.CompletedTask; }); `OpenApiObject`使用 .NET 10,您可以通过替换为以下代码来编写`JsonObject`: options.AddSchemaTransformer( (schema, context, cancellationToken) =\> { if (context.JsonTypeInfo.Type == typeof(Employee)) { schema.Example = new JsonObject { \["joiningdate"\] = new OpenApiString( DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")), \["comments"\] = new OpenApiString("New Employee"), }; } return Task.CompletedTask; }); 要使用此功能,请记住在项目文件中启用 XML 文档生成。以下代码片段展示了如何实现此操作: \ \ true \ \ ASP.NET Core 10 的另一个有趣特性是支持以 YAML 格式生成 OpenAPI 文档。要在`Program.cs`文件中配置此功能,请使用以下代码片段: app.MapOpenApi("/openapi/{documentName}.yaml"); 在 ASP.NET Core 10 中,ASP.NET Core Web API (Native AOT) 项目模板默认支持使用该`Microsoft.AspNetCore.OpenApi`包生成 OpenAPI 文档。要关闭此功能,请使用`--no-openapi`相应的标志。 ![](https://i-blog.csdnimg.cn/direct/88d22fbc01b94fe5b7cb848f4c047f48.png) #### **支持使用 System.Text.Json 的 JSON Patch** JSON Patch 已被公认为修改 JSON 文档的标准方法。它封装了一系列可用于更改 JSON 文档的操作(添加、删除、替换、移动、复制、测试)。在 Web 应用程序中,JSON Patch 通常用于 PATCH 操作,以对资源进行部分属性更新。为了减小有效负载大小并提高性能,客户端可以发送仅包含修改内容的 JSON Patch 文档,而不是发送完整的资源对象。 `Microsoft.AspNetCore.JsonPatch.SystemTextJson`您可以通过在项目中安装 NuGet 包来启用 System.Text.Json 的 JSON Patch 支持。`JsonPatchDocument`该包对应的类可用于表示类型为 T 的实例的 JSON Patch 文档。 让我们通过一个代码示例来理解这一点。请看以下代码片段,它展示了如何`Author`定义一个对象: var author = new Author { FirstName = "Joydip", LastName = "Kanjilal", Address = "Hyderabad, India", Email = "jkanjilal@gmail.com" }; 一个典型的 JSON Patch 文档如下所示: string jsonPatch = """ \[ { "op": "replace", "path": "/Address", "value": "Hyderabad" } \]"""; 接下来,反序列化 JSON 补丁文档,如下面的代码片段所示: var deserializedDocument = JsonSerializer.Deserialize\\>(jsonPatch); 最后,应用如下代码片段所示的 JSON 补丁文档: deserializedDocument!.ApplyTo(author); #### **增强对 OpenAPI XML 文档的支持** .NET 10 中,ASP.NET Core 增强了对 OpenAPI XML 文档注释的支持。现在可以配置 XML 文档处理,以处理当前程序集之外的文档类型。 以下代码片段演示了如何在 Microsoft.AspNetCore.Http 程序集中为类型添加 XML 注释: \ \ \

相关推荐
csdn_aspnet7 小时前
.NET 10 中的新特性和增强功能
.net10
xiangji1 个月前
Aspire+.NET10+手搓线程池打造抓不死的云应用
高并发·aspire·.net10·手搓线程池
IT规划师10 个月前
.NET10 - 预览版1新功能体验(一)
.net10·c#14