实体框架中的汇总功能和自引用表



我很难弄清楚如何处理实体框架中的自我引用实体和汇总功能。我的桌子看起来像这个

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