gpt4 book ai didi

c# - 为什么 EF 代码优先生成无关的外键列?

转载 作者:可可西里 更新时间:2023-11-01 08:05:13 24 4
gpt4 key购买 nike

我正在使用代码优先的 Entity Framework 来自动创建我的数据库模式,我的一个实体如下所示:

public class AssessmentsCaseStudies {
#region Persisted fields
[Required]
[Key, Column(Order=0)]
[ForeignKey("Assessment")]
public int AssessmentId { get; set; }

[Required]
[Key, Column(Order=1)]
[ForeignKey("CaseStudy")]
public int CaseStudyId { get; set; }

[Required]
public int Score { get; set; }

[ForeignKey("Follows")]
public int? FollowsCaseStudyId { get; set; }
#endregion

#region Navigation properties
public virtual Assessment Assessment { get; set; }
public virtual CaseStudy CaseStudy { get; set; }
public virtual CaseStudy Follows { get; set; }
#endregion
}

当 EF 自动生成我的数据库时,它会生成一个包含以下列的表:

AssessmentId (PK, FK, int, not null)
CaseStudyId (PK, FK, int, not null)
Score (int, not null)
FollowsCaseStudyId (FK, int, null)
CaseStudy_CaseStudyId (FK, int, null)

这一切都很好,除了 CaseStudy_CaseStudyId柱子。为什么会产生这种情况?它是做什么用的?我怎样才能阻止它生成?我怀疑 EF 不能再自动匹配 CaseStudyICollection<AssessmentsCaseStudies>CaseStudyId列,因此它会创建自己的列以将该导航属性的两者链接在一起。

最佳答案

因为您的 AssessmentsCaseStudies 实体中有 两个 类型为 CaseStudy 的导航属性,并且您的 AssessmentsCaseStudies 集合中有一个CaseStudy 实体 EF 无法决定此集合引用两个 CaseStudy 导航属性中的哪一个。两者都是可能的,并且这两种选择都会产生有效但不同的实体模型和数据库架构。

在这种模棱两可的情况下,EF 惯例实际上是创建三个 关系,即您在 CaseStudy 中的集合不引用两个 CaseStudy< 中的任何一个 导航属性,但在 AssessmentsCaseStudies 中有第三个(但未公开且“不可见”)端点。这第三种关系是您在数据库中看到的第三个外键的原因 - 带下划线的那个。 (下划线始终强烈表明某些事情是通过映射约定而不是通过您的显式配置或数据注释发生的。)

要解决此问题并覆盖约定,您可以应用 [InverseProperty] 属性,从而将 CaseStudy 导航属性指定为 AssessmentsCaseStudies集合属于:

[InverseProperty("AssessmentsCaseStudies")] // the collection in CaseStudy entity
public virtual CaseStudy CaseStudy { get; set; }

您也可以(或者,您不需要两者)将属性放在集合端:

[InverseProperty("CaseStudy")] // the CaseStudy property in AssessmentsCaseStudies entity
public virtual ICollection<AssessmentsCaseStudies> AssessmentsCaseStudies { get; set; }

关于c# - 为什么 EF 代码优先生成无关的外键列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13310121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com