EF自参考表确定周期

时间:2018-10-22 07:19:20

标签: c# entity-framework

我有一个自引用表,并且正在使用实体框架对其进行定义。

public class Table
{
    public int Id { get; set; }

    public Table Parent { get; set; }

    [ForeignKey(nameof(Parent))]
    public int? ParentId { get; set; }

    public virtual ICollection<Table> Children { get; set; } = new List<Table>();
}

我只能使用EF来确定添加新关系时是否存在周期。例如数据:

  • 项目1
    • 项目2
      • 第3项
    • 第4项
    • 第5项

当我尝试将项目1添加到项目3时,我应该确定将创建一个循环。

1 个答案:

答案 0 :(得分:0)

通过“仅EF”,我假设您是说:通过单个Linq查询

然后AFAIK,这是不可能的。

您应该阅读:Recursive LINQ query: select item and all children with subchildren

考虑以下“不仅是EF”代码:

public AddChildren(Table t) {
    var parent = this;
    while ( parent != null ) {
        if ( parent.Id == t.Id )
            throw new Exception("cycle");
        parent = parent.Parent;
    }
    Children.Add(t);
}

警告:如果存在现有循环,则可能是无限循环。

也许您还应该: