我很难弄清楚如何处理实体框架中的自我引用实体和汇总功能。我的桌子看起来像这个
Task
Id ParentId PercentageInParent CompletedPercentage
0 null null null
1 0 60 null
2 0 40 null
3 1 80 40
4 1 20 60
5 2 50 80
6 2 50 90
PercentageInParent
是父级的子任务表单的百分比。我想查看一项任务,并通过将其子元素概括为何完成。
编辑一个任务(例如任务1)具有子任务的任务将具有CompletedPercentage = null
,如果我想知道其CompletedPercentage
,我想低头看树并计算子任务的完成方式。在这种情况下,任务1与任务3和4完成的距离和任务1的重量相距44%是完全库存的。
您应该添加另一个执行所有映射的类...
public class TaskMap
{
public string TaskId { get; set; }
public string TaskParentId { get; set; }
public virtual Task Task { get; set; }
public virtual Task ParentTask { get; set; }
}
public class Task
{
public string TaskId { get; set; }
public int Progress { get; set; }
public virtual ICollection<TaskMap> SubTasks { get; set; }
}
当您使用Entity Framework
时,您需要更仔细地考虑数据库的设计...请记住,这是relational
数据存储,因此浏览归一化表格仍然很重要。
使用当前设计,您将始终有多个记录,其中ParentId
列为null
。这意味着您的设计中有一个重复的元素,需要提取并放置在单独的桌子中。
新表TaskMaps
应由一个复合主键组成,即TaskID和ParentTaskID。这将创建您的关系,然后您可以通过实施类似的东西来使用这些关系来引用孩子。
var task = this.Context.Tasks.FirstOrDefault(tasks => tasks.TaskId == "random guid")
task.SubTasks.SelectMany(tasks => tasks.SubTasks)
.Select(sub => sub.Task);