用于判断主子关系的方法的实现(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}}
}