我试图使用ef核心和postgre sql代表某种树。我有两个班:
public class ProtocolNode
{
public Guid Id { get; set; }
public string Name { get; set; }
public ICollection<ProtocolCriteria> Criterias { get; set; }
public ProtocolNode()
{
Criterias = new List<ProtocolCriteria>();
}
}
public class ProtocolCriteria
{
public Guid Id { get; set; }
public Guid? ParentId { get; set; }
public ProtocolNode Parent { get; set; }
public Guid? ChildrenId { get; set; }
public ProtocolNode Children { get; set; }
}
之后,我尝试运行迁移来创建数据库,但收到错误:
无法确定导航属性&#39; ProtocolCriteria.Parent&#39;所代表的关系。类型&#39; ProtocolNode&#39;。手动配置关系,或使用&#39; [NotMapped]&#39;忽略此属性。属性或使用&#39; EntityTypeBuilder.Ignore&#39;在&#39; OnModelCreating&#39;。
我认为我需要使用Fluent API制定一些规则,但经过一些尝试后,我被困...... 我会感谢任何帮助。
答案 0 :(得分:0)
通常,自上而下的树结构由相同的节点组成,这些节点具有两个主要属性,父和子。兄弟姐妹
public class node {
public int Id {get; set;}
public int? ParentId {get; set;} // top node has no parent
public virtual Node Parent {get; set;}
public virtual ICollection<Node> Children {get; set;}
}
builder.Entity<Node>() // ModelBuilder
.HasOptional(c => c.Parent)
.WithMany()
.HasForeignKey(c => c.ParentId);
EF使得解析孩子比维护Linked-Lists更容易。这假设您不是在谈论二元树,这是一种特殊情况。
注意:EF Core尚未实现HasOptional()功能。