使用 EF Core 7,我正在为顶级父(聚合根)实体实施审计日志解决方案。我有 ChangeTracker 提供给我的 EntityEntry 列表。
问题:有没有办法确定每个 EntityEntry 是否是顶级父实体?如果是child,那么判断哪个Entity是顶级parent?
var entries = ChangeTracker.Entries().Where(q => q.State == EntityState.Modified || q.State == EntityState.Deleted || q.State == EntityState.Added);
是否有内置函数可以返回顶级父级?
否则,我唯一的想法就是递归地使用导航来找到它。
// Recursive function to get the top-level parent entity
public object GetTopLevelParent(EntityEntry entry)
{
// Check if the current entry is the top-level parent entity
if (entry.Metadata.ToClrType == typeof(TopLevelParent))
{
return entry.Entity;
}
// Traverse the navigation properties to get the top-level parent entity
foreach (var navigationEntry in entry.Navigations)
{
var navigationValue = navigationEntry.CurrentValue;
if (navigationValue != null)
{
var navigationEntry = dbContext.Entry(navigationValue);
var topLevelParent = GetTopLevelParent(navigationEntry);
if (topLevelParent != null)
{
return topLevelParent;
}
}
}
// Top-level parent entity not found
return null;
}
旁注:我做了广泛的研究,但没有运气,试图找到一种审计解决方案,该解决方案将在数据库中为顶级父级创建单个审计记录。审核记录将包含一个 JSON 数据字段,该字段应包含在父项和子项中所做的所有更改。这将以指数方式最小化在审计表中创建的行数。