我在数据库中有以下架构:

  • BillingReferences (ReferencingType tinyint、ReferencingId tinyint、ReferencedType tinyint、ReferencedId tinyint、IsActive bit) - 其中所有字段(IsActive 除外)都是唯一索引的一部分。
  • BillingType (BillingTypeId tinyint, Name varchar(50))

  • ReferencingType 和 ReferencedType 是 BillingTypes 的外键。
    BillingTypes 包含以下行:

    帐单类型 ID |名称

    1 |标签

    2 |国家

    3 |支付提供商

    4 |付款方式

    5 |银行

    ReferecingId 和 ReferencedId 表示以下实体之一的 Id(取决于引用/引用类型):
  • 银行 (BankId tinyint, Name varchar(50))
  • 国家 (CountryId tinyint, Name varchar(50))
  • 标签 (LabelId tinyint, Name varchar(50))
  • PaymentProviders (PaymentProviderId tinyint, Name varchar(50))
  • PaymentOptions (PaymentOptionId tinyint, Name varchar(50))

  • 将来,每个实体都会添加更多不同的列,但现在这是为简单起见的模式。

    每个实体(国家除外)与国家之间都有 (1-) 的联系。
    标签具有 (1-) 到银行、PaymentProviders 和 PaymentOptions 的连接。
    并且 PaymentProviders 与 PaymentProviders 有 (1-*) 的连接

    例如,如果我想将 BankId 为 201 的银行连接到 CountryId 为 3003 的国家
    我将在 BillingReferences 中有一条记录,如下所示:
    引用类型 = 5
    引用 ID = 201
    引用类型 = 2
    引用 ID = 3003
    事件 = 1

    出于可扩展性的考虑,我们没有为每种类型的连接制作连接/引用表 - 如果我们想要添加另一个实体,我们要做的就是添加它的表并在 BillingReferences 和 BillingType 中为其添加记录。

    问题是我无法在 BillingReferences 和每个实体之间配置条件外键,而且我似乎也无法使用 EntityFramework 配置/映射它......

    我找不到任何使用这种类型实现的教程或示例。
    我是否必须为每个连接创建一个引用表,或者有没有办法用 EntityFramework 配置它?

    谢谢您的帮助 :)

    最佳答案

    AFAIK,没有办法做到这一点。

    我会为每种类型创建一个单独的表,除非你真的有充分的理由不这样做。你提到的考虑不是一个好的考虑,恕我直言。

    拥有更多表确实允许您在键上放置外键约束,并且它可以很好地转换为 EF。它还有助于提高性能:与更多较小的表相比,具有一百万行的大引用表将花费更多的时间来查询(除非您总是想要一个类型的所有引用)。

    关于entity-framework - Entity Framework : Conditional foreign key,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/605813/

    10-12 15:52