EF 5 一对多自引用 - 代码优先

Posted

技术标签:

【中文标题】EF 5 一对多自引用 - 代码优先【英文标题】:EF 5 one to many self referencing - code first 【发布时间】:2013-02-13 21:24:13 【问题描述】:

我已经阅读了许多一对多的自引用帖子,但看到了我的具体排列。如果我错过了,请发布链接。

这是我的场景。我有两张桌子。 Feature 包含 Epic 的集合,Epic 可以递归地包含子 Epic 的集合(我可以有 child child child (n) Epic 集合)。

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

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;  

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

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

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

【问题讨论】:

【参考方案1】:

显然,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中没有开箱即用的这种机制。

【讨论】:

以上是关于EF 5 一对多自引用 - 代码优先的主要内容,如果未能解决你的问题,请参考以下文章

2个表之间的关系 - 一对多和一对一(可空)EF代码优先

prisma 模式中的一对多自关系

用于一对零或一关系的实体框架 (EF) 代码优先级联删除

实体有两个属性,它们都在一对多关系中引用相同的实体类型

Hibernate的一对多自关联中的级联删除问题

使用 EF 6.0 和代码优先的一对一 EntityTypeConfiguration