【问题标题】:Should I need to define two fields per foreign key in ASP.NET Core EF我是否需要在 ASP.NET Core EF 中为每个外键定义两个字段
【发布时间】:2016-10-11 10:30:06
【问题描述】:

假设我需要有两个名为WagonsWagonTypes 的表。显然,Wagons 表中的每一行都应该通过外键引用对应的WagonTypes 记录。

我这样做对吗?

public class Wagons
{
    public Guid Id { get; set; }

    [Required]
    public WagonTypes Type { get; set; }
}

public class WagonTypes
{
    public Guid Id { get; set; }

    [Required]
    public string Name { get; set; }
}

是的,它可以工作,但我不明白为什么docs 中有一个额外的字段然后:

    public int BlogId { get; set; }
    public Blog Blog { get; set; }

拥有BlogId 字段有什么意义?我也应该定义它吗?

【问题讨论】:

  • 你的结构看起来不错。它在文档中进行了解释。 Post.Blog 是一个参考导航属性。您不必添加它。
  • 来自docs按照惯例,只有在发现关系但在依赖实体类中找不到外键属性时才会创建影子属性
  • 在我看来,您的示例和引用的示例之间存在细微差别:在参考示例中,关系是一个博客与多个帖子的关系(因此帖子可以具有导航属性是有道理的到博客);在您的示例中,反之亦然,Wagon 只能是一个 WagonType,因此您将拥有一个 WagonType 实体并希望返回其父 wagon 是没有意义的(一对多关系是其他方式)。
  • 单独指定外键的一个好处是它允许您在不加载整个相关实体的情况下检索外键的值。 (如果您使用延迟加载,这很有用 - 例如public virtual WagonTypes Type { get; set; }

标签: c# entity-framework ef-code-first asp.net-core


【解决方案1】:

您不必添加外键,但建议您这样做,因为它让您的生活更轻松。

假设您想编辑表格 Wagons 中的某些行(例如属性名称)。您必须获取对象,编辑名称,然后加载属性类型,然后调用 SaveChanges。如果您没有加载 Type,EF 会认为您也想编辑该 Type。

如果您的 Wagons 类中有 public int TypeId{ get; set; },您可以直接获取该对象,直接编辑 Name 并调用 SaveChanges 而无需进一步加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多