我已经阅读了许多一对多的自引用文章,但是看到了我的特定排列。如果我错过了,请发布链接。

这是我的情况。我有两张桌子。 Feature包含史诗集合,而Epic可以递归包含子史诗集合(我可以拥有子史诗集合child child child(n)史诗集合)。

以下是我要创建的模型类型的简单概述。

public class Feature
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Epic> Epics { get; set; }
}

public class Epic
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int FeatureId { get; set; }

    public int ParentEpicId { get; set; }
    public virtual ICollection<Epic> ChildEpics { get; set; }
}


我几乎可以在modelBuilder中指定关系,但是挂在一件事上。史诗的第一个集合将具有返回到父特征的FeatureId FK和一个值为null的ParentEpicId,但低于此级别的史诗集合的所有级别都将FeatureId设置为null,并将ParentEpicId设置为父史诗的ID。 (FeatureId可以指向史诗儿童树的顶层功能,但这不是必需的)

如何首先在EF代码中指定这种类型的关系?

如果不清楚或您需要更多信息,请告诉我。

最佳答案

显然,由于FeatureIdParentEpicId都映射到数据库中的可为空的列,因此需要将它们映射到数据模型中的可为空的属性。您应该将Epic类更改为:

public class Epic
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int? FeatureId { get; set; }

    public int? ParentEpicId { get; set; }
    public virtual ICollection<Epic> ChildEpics { get; set; }
}


至于必须精确设置FeatureId和ParentEpicId之一的要求,我认为EF中没有现成的机制。

09-13 13:49