【问题标题】:How do I model an alternate foreign key in Entity Framework Core如何在 Entity Framework Core 中为备用外键建模
【发布时间】:2017-11-19 01:33:51
【问题描述】:

我正在尝试在 EF 中建模一个结构,其中我们有多个实体,每个实体都有本地化内容。所有这些本地化内容都存在于一个表中。 (见下例)

我遇到了一个问题,当我使用流畅的语法定义外键时,并且当 EF 运行迁移以构建数据库时,它将在本地化表中的 LKey 字段上应用多个外键。即FK_Localization_Foo1_LKey/FK_Localization_Foo2_LKey。 这是不正确的,因为现在不可能在本地化表中插入任何记录。

我怎样才能停止这种行为,或者我应该改变什么来实现我在 EF 中寻找的东西?

附言我已经看到建议在哪里创建中间表的示例,该表仅包含 LKey 作为其主键,其他表引用此表。如果可能的话,我想避免这种情况,以使我们的 DBA 满意。

  public class Foo
  {
      ...
      [Required][StringLength(5)]
      public string LKey { get; set; }
      public ICollection<Localization> Localizations { get; set; }
  }
  // many entities similar to 'foo' with the same navigation

  public class Localization
  {
      public int LocalizationId { get; set; }

      [Required][StringLength(5)]
      public string LKey { get; set; }
      [Required][StringLength(10)]
      public string LangISO { get; set; }
      ...
  }

// inside the OnModelCreating method, there are multiple entries like the below, one for each 'Foo' type entity above

 modelBuilder.Entity<Foo>()
    .HasMany(pt => pt.Localizations)
    .WithOne()
    .HasPrincipalKey(pt => pt.LKey)
    .HasForeignKey(l => l.LKey);

更新: 以下是当前针对此 DB 运行的查询示例(并且已经运行多年),因此可以肯定地说,该模型与 RDB 不兼容。

当我去询问时,我们的 DBA 跟进“这绝对有可能。它有效,因为存在关系,但没有外键 约束。它不是 NF,但它工作得很好。”

也许我最初的问题并不清楚,如果是这种情况,我们深表歉意。我们要做的是对关系进行建模,并允许在模型上进行正常的 EF 导航(这适用于上述情况代码),但没有有迁移创建 FKey。

select f1.Foo1Id, ll.Text from Foo1 f1
inner join LocalizationLanguage ll on ll.DescriptionKey = f1.DescriptionKey

select f2.Foo2Id, ll.Text from Foo2 f2
inner join LocalizationLanguage ll on ll.DescriptionKey = f2.DescriptionKey

【问题讨论】:

    标签: entity-framework-core foreign-key-relationship entity-framework-migrations


    【解决方案1】:

    您正在尝试实现与关系数据库绝对不兼容的数据结构。

    您不能在一个表 (Localizations) 中包含一个字段 (LKey),该字段是许多其他表之一的外键。关系数据库不支持这一点。 DB Engine(你也一样)永远不会知道哪个表(Foo1,Foo2,... FooX)包含特定子记录 LKey='ABCD' 的“父”记录。

    你有两个选择:

    1. 如果您的 Foo 表具有相似的字段 - 使用 Table Per Hierarchy pattern - 您的所有 Foo 实体将存储在一个物理表中,并带有带有类名的附加字段。
      table per type (TPT)table per 具体类型 (TPC) 将被支持later

    2. 改变你的关系方向。将Localizations 设为您的父故事(使用LKey 键)和所有Foo 表 - 使用LKey 作为外键的子。

    【讨论】:

    • 抱歉耽搁了后续。我已经用更多上下文等更新了问题
    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 2016-12-16
    • 2022-09-22
    • 1970-01-01
    • 2018-08-19
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多