首页 > 解决方案 > 如何使用 Fluent Api 使我的结构与 EF Core 一起工作?

问题描述

我正在尝试使用 ef core 和 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; }
}

之后,我尝试运行迁移以创建数据库,但出现错误:

无法确定“ProtocolNode”类型的导航属性“ProtocolCriteria.Parent”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。

我假设我需要使用 Fluent API 制定一些规则,但经过一些尝试后我被卡住了......我会感谢任何帮助。

标签: entity-frameworkentity-framework-coreef-core-2.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 使得解析子节点比维护链接列表更容易。这假设您不是在谈论二叉树,这是一种特殊情况。

注意:EF Core 尚未实现 HasOptional() 功能。


推荐阅读