Entity Framework Core支持HierarchyId
Entity Framework Core 官方支持 HierarchyId,这使您能够在 SQL Server 数据库中存储和查询层次数据。层次数据是许多应用程序中常见的数据结构。无论您正在处理组织结构、产品类别还是带有线程的讨论,高效处理层次结构都至关重要。在这篇博文中,我们将探讨如何结合 Entity Framework Core(EF Core)和 HierarchyId 来管理层次数据。
如何在 EF Core 中使用 HierarchyId
要在 EF Core 中使用 HierarchyId,您需要安装
Microsoft.EntityFrameworkCore.SqlServer.HierarchyId NuGet 包。该包包含 HierarchyId 的查询和更新支持。
要配置 EF Core 使用 HierarchyId,您需要在配置 SQL Server 提供程序时调用 UseHierarchyId 方法。
options.UseSqlServer(connectionString, x => x.UseHierarchyId());
建模层次结构
可以使用 HierarchyId 类型来表示实体类型的属性。例如,假设我们要建模组织中的人员。每个人都有一个姓名和一个经理。经理也是一个人。我们可以使用以下实体类型来建模:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public HierarchyId Manager { get; set; }
}
可以通过 Manager 属性从族长一直追溯到树的底部。SQL Server 对这些路径使用紧凑的二进制格式,但在使用代码处理时,通常会解析成可读的字符串表示形式。在这个表示中,每个级别的位置由/字符分隔。
查询层次结构
HierarchyId 提供了在 LINQ 查询中使用的多个方法。
GetAncestor(int level) 返回指定级别的祖先。
GetDescendant(HierarchyId? child1, HierarchyId? child2) 返回指定级别的后代。
GetLevel() 返回节点在层次结构中的级别。
GetReparentedValue(HierarchyId? oldRoot, HierarchyId? newRoot) 返回具有新父节点的节点。
IsDescendantOf(HierarchyId? parent) 返回节点是否是指定节点的后代。
示例:
// 获取树中特定级别的实体
var generation = await context.Persons.Where(x => x.Manager.GetLevel() == level).ToListAsync();
// 获取实体的直接祖先
var parent = await context.Persons.Where(x => x.Manager.GetAncestor(1) == manager).SingleAsync();
例如,您的公司可能希望更改组织单位的经理。为此,您可以使用 GetReparentedValue 方法更新组织单位所有后代的经理。
var newManager = await context.Persons.SingleAsync(x => x.Id == newManagerId);
var descendants = await context.Persons.Where(x => x.Manager.IsDescendantOf(oldManager)).ToListAsync();
foreach (var descendant in descendants)
{
descendant.Manager = descendant.Manager.GetReparentedValue(oldManager.Manager, newManager.Manager);
}
await context.SaveChangesAsync();
更新于:3个月前相关文章
- .Net Core中Dapper的使用详解
- ASP.NET 使用Entity Framework (EF) 创建迁移修改SQLite数据库表结构
- 如何从.NET Framework迁移到.NET Core或.NET 6/7?
- 如何优化ASP.NET Core应用的性能?
- PluginCore 基于 ASP.NET Core 的轻量级插件框架
- .NET C# EntityFramework(EF)连接SQLite代码示例
- ASP.NET Core 中常用的内置中间件
- 鸿蒙OpenHarmony系统可以运行跨平台的.NET Core吗?
- ASP.NET Core使用partial标签报错
- .NET Framework被淘汰了吗?
- Asp.Net Core进程内托管 和 进程外托管的区别
- ASP.NET Core实现多语言本地化Web应用程序
- PDFiumCore | .NET Core PDF 处理渲染库
- ASP.NET Core 2.1中的ActionResult<T>
- .NET Core 3.0创建一个单独的可执行文件
- 在ASP.NET Core 2.1中使用HttpClientFactory的3种方法
- .NET Core MVC应用程序创建教程
- .NET Core中的File和PhysicalFile
- .NET Core 读取配置文件方法
- .NET Core 管道模型中间件及管道模拟实现