2013-02-13 38 views
3

我已经阅读了许多自引用帖子,但已经看到了我的具体排列方式。如果我错过了,请张贴链接。EF 5一对多自引用 - 代码优先

这是我的场景。我有两张桌子。 Feature包含Epics的集合,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; } 
} 

我几乎可以指定模型构建器中的关系,但挂上了一件事情。史诗的第一个集合将有一个FeatureId FK返回到父Feature,并且一个空ParentEpicId,但是低于此的所有级别的史诗集合都将FeatureId设置为null,ParentEpicId设置为父级史诗的Id。 (FeatureId可以指向史诗级儿童树的顶级特征,但这不是必需的)

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

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

回答

3

由于很显然,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这种机制开箱。