首页 程序笔记 Entity Framework Core支持HierarchyId

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();
5

站星网

Entity Framework Core 官方支持 HierarchyId,这使您能够在 SQL Server 数据库中存储和查询层次数据。层次..

为您推荐

.NET Core 中替代 System.Drawing 的图像处理库:ImageSharp、SkiaSharp、Magick.NET 等对比分析

随着 .NET Core / .NET 6+ 平台对跨平台支持的加强,以及 System.Drawing.Common 在非 Windows 平台上的限制日益凸显,越来越多的开发者需要寻找合适的替代方案。微软从 .NET 6 起明确指出,System.Drawing.Common ..

Access to the path 'C:\Windows\TEMP\ASPNETCORE_xxx.tmp' is denied. 解决方法

.NET 网站上传文件时报错:System.InvalidOperationException: The exception handler configured on ExceptionHandlerOptions produced a 404 status response. This InvalidOperationException containing the ori..

在 ASP.NET Core 中:修改 appsettings 后程序会自动重启吗?详解与实践

在日常 ASP.NET Core 开发中,很多人疑惑:当修改 appsettings.json 或其他配置文件后,程序会自动重启吗?答案是:不一定。具体行为取决于托管环境、配置加载方式、以及代码中是否支持“热重载”或&ldquo..

.NET Core 图像处理:Magick.NET 与 SkiaSharp 的全面对比

随着 .NET Core 的发展,传统的 System.Drawing 库因其对 Windows 的依赖性和在跨平台应用中的限制,逐渐被其他图像处理库所取代。在众多替代方案中,Magick.NET 和 SkiaSharp 是最受欢迎的两个选择。本文将从多个维..

Entity Framework(EF) Core 10新特性全面解析:提升开发效率的关键更新​

Entity Framework Core(EF Core)作为 .NET 平台的主流对象关系映射(ORM)框架,持续为开发者提供高效、灵活的数据访问解决方案。​在最新发布的 EF Core 10 中,微软引入了多项新特性,旨在简化数据库操作,提升..

Entity Framework(EF)DbContext SaveChanges()生命周期

在Entity Framework(EF)中,SaveChanges()方法的作用是保存DbContext上下文中所有被跟踪的更改。这意味着,在一个DbContext实例的生命周期内,无论对象在何处被修改,只要它们被DbContext跟踪,SaveChanges()都会..

.NET Core 使用ML.NET 机器学习分析预测股票走势

在 .NET Core 中,你可以利用 ML.NET 框架来构建机器学习模型,以预测股票价格走势。以下是一个基本的实现步骤:​1. 准备数据:​收集并整理股票的历史数据,包括日期、开盘价、最高价、最低价、收盘价和成交量等信..

ASP.Net Core WebApi几种版本控制对比

一、版本控制的好处:(1)有助于及时推出功能, 而不会破坏现有系统。(2)它还可以帮助为选定的客户提供额外的功能。API 版本控制可以采用不同的方式进行控制,方法如下:(1)在URL 中追加版本或作为查询字符串参..

.NET CORE 设置cookie以及获取cookie

使用我这个方式的前提是在mvc中,确认你安装了:Microsoft.AspNetCore.Mvc.然后在继承了Controller的类型中使用我所说的方法。直接使用即可,我是封装了方法供我自己使用,代码如下: public abstract class Control..

VS创建.NET Core项目使用Docker方式部署到Linux服务器

在 Visual Studio(VS) 中,使用 Docker 方式部署 .NET Core 项目 到 Linux 服务器,可以简化环境管理并提高部署效率。以下是完整教程:1. 在 VS 创建 .NET Core 项目并启用 Docker新建 ASP.NET Core 项目打开 Visu..

.NET Core网站减少内存占用的方法

在.NET Core网站开发中,有效管理内存占用对于保证应用程序的性能和稳定性至关重要。以下是一些减少内存占用的关键策略,它们着重于代码优化、内存管理以及相关因素的综合考虑。代码层面的优化首先,编写高效的代码..

一个简单的大转盘抽奖程序(附.NetCore Demo源码)

最近闲下来在做一些demo,现在讲一下做的一个简单的大转盘抽奖demo,前端lottery,layui,后端.net core,sqlsugar,数据库用的mysql1.前端实现:前端用的是基于开源的lottery,其中有些改动的,使得前端可以自适应pc端..

EntityFramework(EF) 控制并发和事务防止超卖

在使用 Entity Framework (EF) 时,实现加减库存并避免超卖的关键是正确地控制并发和事务。以下是实现方法:解决超卖的关键点事务管理:使用事务确保加减库存和库存校验是一个原子操作。悲观锁:通过数据库层面的锁..

基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体之基础

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.文档地址:https://liningit.github.io/LnskyDB/开源地址:https://github.com/liningit/Ln..

ABP.Net Core使用教程(一)启动模版项目

只需要简单的3步:1,到官网下载模版项目 https://aspnetboilerplate.com/Templates2,用VS2017打开,将Web.Host设置为启动项3,在程序包管理器控制台(Nuget控制台)里设定默认项目为EntityFrameworkCore,执行命令..

使用System.Linq.Dynamic.Core扩展库动态构建 LINQ 查询

System.Linq.Dynamic.Core 是一个扩展库,用于在运行时动态构建 LINQ 查询,支持字符串形式的表达式解析和动态查询操作。它是 .NET 的一个强大工具,适合处理需要灵活定义查询逻辑的场景,例如动态过滤、排序、投影..

鸿蒙系统HarmonyOS支持Docker吗?

华为鸿蒙系统(HarmonyOS)本身并不是直接为容器化设计的操作系统,因此在原生支持上并没有内置对 Docker 的直接支持。不过,可以通过以下方式实现某些 Docker 的功能:1. 鸿蒙系统的定位鸿蒙系统主要针对 IoT(物联..

5个高性能 .NET Core 图片处理库推荐

在使用 .NET Core 开发中,图片处理是一个常见需求,如图像缩放、裁剪、格式转换和添加水印等。以下是一些推荐的 .NET Core 图片处理库,它们功能强大且支持多种图像处理功能:1. ImageSharp简介:ImageSharp 是一个..

EntityFrame(EF) SQLite常见问题和解决方案

在使用 Entity Framework (EF) SQLite 时可能遇到的一些问题,下面是一些常见的问题和对应的解决方案。1. 无法找到适配器或数据库提供程序运行 EF 时提示类似以下错误:No database provider has been configured fo..

EntityFramework SQLite 为时间字段设置默认值为当前时间

在使用 Entity Framework Core 和 SQLite 时,可以通过以下步骤为时间字段设置默认值为当前时间:方法一:在模型配置中设置默认值你可以在 DbContext 的 OnModelCreating 方法中,通过 Fluent API 配置默认值:prote..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制
蜂鸟影院2048影视资源论坛熊猫影视河马影视星辰影视萝卜影院八哥电影网人人看电影无忧影视网橙子影视网叮当影视网天天影视网青青影视网电影天堂开心追剧网西瓜影院麻花影视网70影视网年钻网茶小舍电影藏影堂新神州影域煮酒观影体积影视爱看影院星光电影至尊影院极影公社超清视界