我有一个自引用表,并且正在使用实体框架对其进行定义。
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添加到项目3时,我应该确定将创建一个循环。
答案 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);
}
警告:如果存在现有循环,则可能是无限循环。
也许您还应该: