当前位置: 首页 > news >正文

用于判断主子关系的方法的实现(orm是efcore)

  • HasParentChildRelationship 方法:主要用于判断给定实体集合中是否存在主子关系,通过检查实体的导航属性来实现。
  • CheckForDependencies 方法:是一个辅助方法,负责具体的依赖关系检查,包括对已访问实体的跟踪,以避免循环引用。
  • 这行代码的目的是根据当前实体的导航属性类型(是集合还是单个引用)来获取该属性的当前值。具体来说:

  • navigation.IsCollection:检查当前导航属性是否是一个集合(例如,一对多关系)。
  • dbContext.Entry(entity).Collection(navigation.Name).CurrentValue:如果是集合类型,使用此方法获取集合的当前值。
  • dbContext.Entry(entity).Reference(navigation.Name).CurrentValue:如果是单个引用类型,使用此方法获取引用的当前值。
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using System;
using System.Collections.Generic;
using System.Linq;namespace EFCore.BulkExtensions
{public class GraphUtil{/// <summary>/// 判断一组实体是否存在主子关系/// </summary>/// <param name="dbContext"></param>/// <param name="entities"></param>/// <returns>如果存在主子关系,则返回 true;否则返回 false。</returns>public static bool HasParentChildRelationship(DbContext dbContext, IEnumerable<object> entities){if (!entities.Any()){return false; // 如果没有实体,则没有主子关系}var visitedEntities = new HashSet<object>();foreach (var entity in entities){if (CheckForDependencies(dbContext, entity, visitedEntities)){return true; // 如果找到主子关系,立即返回 true}}return false; // 如果没有找到任何主子关系,返回 false}private static bool CheckForDependencies(DbContext dbContext, object entity, HashSet<object> visitedEntities){var entityType = dbContext.Model.FindEntityType(entity.GetType());if (entityType == null || visitedEntities.Contains(entity)){return false; // 如果实体不在模型中或者已经访问过,直接返回 false}visitedEntities.Add(entity); // 标记该实体为已访问var entityNavigations = entityType.GetNavigations();foreach (var navigation in entityNavigations){var navigationValue = navigation.IsCollection? dbContext.Entry(entity).Collection(navigation.Name).CurrentValue: dbContext.Entry(entity).Reference(navigation.Name).CurrentValue;if (navigationValue != null){// 如果发现了依赖关系,返回 truereturn true; // 找到主子关系}}return false; // 如果没有找到依赖关系,返回 false}}
}

相关文章:

  • [特殊字符] Word2Vec:将词映射到高维空间,它到底能解决什么问题?
  • 深入解析OkHttp与Retrofit:Android网络请求的黄金组合
  • 蓝桥杯1447 砝码称重
  • Python 实例传递的艺术:四大方法解析与最佳实践
  • 用 RefCounted + WeakPtr 构建线程安全的异步模块
  • 【OpenCV基础2】图像运算、水印、加密、摄像头
  • 如何在 Windows 11 或 10 上安装 FlutterFire CLI
  • CSS提高性能的方法有哪些
  • C++面试4-sizeof解析
  • RabbitMQ的简介
  • C 语言学习笔记(函数2)
  • AI在网络安全中的应用之钓鱼邮件检测
  • Python列表 vs 元组:全面对比解析(新手友好版)
  • MYSQL8.0常用窗口函数
  • input组件使用type=“number“的时候,光标自动跳到首位
  • 【Tools】VMware Workstation 17.6 Pro安装教程
  • 在 CentOS 7.9 上部署 node_exporter 并接入 Prometheus + Grafana 实现主机监控
  • PyMOL命令行和脚本
  • 精益数据分析(70/126):MVP迭代中的数据驱动决策与功能取舍
  • AI神经网络降噪 vs 传统单/双麦克风降噪的核心优势对比
  • 中国戏剧梅花奖终评结果公示,蓝天和朱洁静等15名演员入选
  • 上海中心城区首条“定制化低空观光航线”启航,可提前一天提需求
  • 证监会披露两起操纵市场处罚结果,今年来涉操纵股票罚没金额超7.5亿元
  • 国际博物馆日|在辽宁省博物馆遇见敦煌
  • AG600“鲲龙”批生产首架机完成生产试飞
  • 首届中国人文学科年度发展大会启幕,共话AI时代人文使命