目录
[安装 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 项目)
[将表单提交中的空字符串转换为可空值类型的 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.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.EntityFrameworkCore和Microsoft.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 Patch
System.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 项目:
- 启动 Visual Studio 2022 IDE 预览版。
- 在"创建新项目" 窗口中,选择ASP.NET Core Web API,然后单击"下一步"继续。
- 在"配置新项目"窗口中,指定项目名称和创建路径。
- 如果您希望解决方案文件和项目创建在同一目录下,可以选择选中"将解决方案和项目放在同一目录下"复选框。单击"下一步"继续。
- 在下一个屏幕中,从相应的下拉控件中,将目标框架指定为**.NET 10.0(预览版)** ,并将身份验证类型指定为None 。
- 请确保"配置 HTTPS"、"启用 Docker 支持"、"不使用顶级语句"和"启用 OpenAPI 支持"复选框未选中,因为在本示例中您不会使用这些复选框。
- 请记住选中"使用控制器"复选框,因为本示例中不会使用最小 API。
- 点击"创建"完成该过程。
一个新的 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 展示了如何QuickGrid在 ASP.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 文档生成。以下代码片段展示了如何实现此操作:
\