如何使用Fluent Api使用EF Core处理我的结构?

时间:2018-06-01 15:57:01

标签: entity-framework entity-framework-core ef-core-2.0

我试图使用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制定一些规则,但经过一些尝试后,我被困...... 我会感谢任何帮助。

1 个答案:

答案 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()功能。