【问题标题】:EF Code First Navigation Property to same tableEF Code First 导航属性到同一个表
【发布时间】:2016-03-16 10:33:37
【问题描述】:

我是 EF 新手,正在努力实施以下方案。我有一个实体,我想拥有一个导航属性到另一个相同的实体。例如

public class Stage {
    public int ID { get; set; }
    public int? NextStageID { get; set; }
    public string Name { get; set; }

    public virtual Stage NextStage { get; set;}
}

到目前为止,我发现的唯一示例是实体具有父/子关系,即导航属性是同一实体的 ICollection。我尝试调整它,但无法让它在我的实例中工作。另外,我只需要它是一种方式,即实体没有“PreviousStage”属性,只有“NextStage”属性。我正在使用 Fluent API 进行配置。有人可以建议是否/如何实现这一目标?

我收到此错误:

无法确定类型“namespace.Stage”和“namespace.Stage”之间关联的主体端。此关联的主体端必须使用关系流式 API 或数据注释显式配置

编辑 刚刚在我稍微简化的示例中意识到,我没有表明 NextStageID 是可选的(int?)。

【问题讨论】:

  • 我认为按照惯例,上述模型应该已经存在这种关系。
  • @gldraphael 我收到此错误消息:“无法确定类型 'namespace.Stage' 和 'namespace.Stage' 之间关联的主体端。此关联的主体端必须使用关系流式 API 或数据注释显式配置。"
  • Here's 如何使用流畅的配置设置 FK。
  • 谢谢@Jasen!我跳过了 .HasMany 选项,因为我认为这将用于与一端或另一端的许多关系。似乎,正如那篇文章所描述的,它也适用于不涉及很多人的关系。有点奇怪,但这似乎已经完成了工作!您要发布作为答案吗?

标签: c# entity-framework ef-fluent-api


【解决方案1】:

您可以如下显式定义关系:

public class Stage {
    public int ID { get; set; }
    public int NextStageID { get; set; }
    public string Name { get; set; }

    [ForeignKey("NextStageID ")]
    public virtual Stage NextStage { get; set;}
}

【讨论】:

  • 您能描述一下如何使用 Fluent API 实现相同的功能吗?就像我开始时那样,并且更愿意将其全部保存在一个地方。
  • @Jasen 提供了以下链接,描述了如何使用 Fluent API 执行此操作。谢谢你们俩。 stackoverflow.com/questions/19359608/…
【解决方案2】:

您需要添加 parentId 和 Parent 导航属性 和 Children 导航属性,因此实体框架理解这是一种递归关系 检查这个stack Overflow link的答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 2014-01-20
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多