【问题标题】:Should I define `foreign key Id` property in addition to the corresponding `navigation property`?除了相应的“导航属性”之外,我还应该定义“外键 ID”属性吗?
【发布时间】:2018-04-15 15:16:55
【问题描述】:

我在 Microsoft 教程之一中找到了这些实体:

public class Enrollment
{
    public int Id{ get; set; }

    public int StudentId { get; set; }
    public Student Student { get; set; }
}

public class Student
{
    public int Id { get; set; }

    public ICollection<Enrollment> Enrollments { get; set; }
}

我真的需要定义StudentId 属性吗?

在不同类型的关系的情况下,情况会有什么不同?例如one-oneone-many?

更新:

在此链接http://www.learnentityframeworkcore.com/relationships 中我们可以看到,在 One-Many 和 Many-Many 中,他们没有定义 Id 外键属性,但在 One-One 中,他们定义了。这是为什么呢?

【问题讨论】:

  • 这取决于您要建模的关系。 StudentId 是注册以匹配学生的 FK。当你说它有效时——什么有效?这种关系是双向的吗?是不是还有一个 Course 表和 Enrollment 是 Student-Course 的关系表?
  • @Jasen 我稍微编辑了这个问题,你能解释一下这两种关系吗?我对此有点困惑。好的,是的,有课程关系,但我认为这在我的问题中并不重要,对吧?我删除了它以保持一切简单。
  • 我猜是的,因为 EF Core 根据 ef core 命名约定使用该列
  • @H.Herzl,谢谢,但实际上我需要一个具体的答案,因为我没有在我找到的所有教程中找到它,它应该在关系的双方,还是只有一个一边?
  • 关于添加StudentId的定义,记住ef需要一个属性来生成join,否​​则ef无法生成join进行查询。如果您不应用任何映射(流利的 api 或数据注释),则必须遵循约定,否则您可以更改列的名称。

标签: c# .net entity-framework .net-core entity-framework-core


【解决方案1】:

我在此页面中找到了我的问题的部分答案:

http://www.learnentityframeworkcore.com/conventions

外键阴影属性:
如果您选择不在关系的依赖端显式包含外键属性,EF Core 将使用模式 Id 创建影子属性。

但我还是不知道是不是所有类型的关系都是这样。

希望对大家有所帮助。

更新

好的,现在我找到了我想知道和理解的内容,请查看这些链接,其中包含创建模型(实体)的不同约定:

http://www.learnentityframeworkcore.com/conventions/one-to-many-relationship

http://www.learnentityframeworkcore.com/conventions/one-to-one-relationship

【讨论】:

  • 仍然不清楚何时使用影子属性或明确定义关系的键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
相关资源
最近更新 更多