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

  • 帐单参考 (引用类型 小整数, 引用 ID 小整数, 引用类型 小整数, 参考 ID 小整数, , 活跃 少量) - 其中所有字段(IsActive 除外)都是唯一索引的一部分。
  • 计费类型 (帐单类型 ID 小整数, , 姓名 varchar(50))

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

BillingTypeId | 名称

1 | 标签

2 个国家

3 | 支付提供商

4 | 支付选项

5 | 银行

ReferecingId 和 ReferencedId 表示以下实体之一的 Id(取决于引用/引用类型):

  • 银行 (银行 ID 小整数, , 姓名 varchar(50))
  • 国家 (国家/地区 ID 小整数, , 姓名 varchar(50))
  • 标签 (标签 ID 小整数, , 姓名 varchar(50))
  • 支付提供商 (付款提供商 ID 小整数, , 姓名 varchar(50))
  • 付款方式 (付款选项 ID 小整数, , 姓名 varchar(50))

将来,每个实体将添加更多不同的列,但现在这是为了简单起见的架构。

有 (1-)每个实体(国家除外)到国家之间。标签的连接为 (1-) 至银行、支付提供商和支付选项。PaymentProviders 与 PaymentProviders 之间有 (1-*) 连接

例如,如果我想将 BankId 为 201 的银行与 CountryId 为 3003 的国家连接起来 我将在 BillingReferences 中创建一条类似的记录:引用类型 = 5 引用标识 = 201 引用类型 = 2 引用标识 = 3003 IsActive = 1

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

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

我无法找到任何使用此类实现的教程或示例。我是否必须为每个连接创建一个参考表,或者有没有办法使用 EntityFramework 进行配置?

谢谢您的帮助 :)

有帮助吗?

解决方案

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

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

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

其他提示

不仅在实体框架中无法做到这一点,在 SQL 中也无法做到这一点。您不能拥有引用五个不同表之一的外键。

我认为你应该做的是拥有一个父级抽象引用类型,并使具体类型成为该父类型的子类型。现在一张表只有一个外键。您可以选择每个类型表或每个层次结构表映射。鉴于您提到的任何类型中根本没有任何特殊列,我认为 每个层次结构的表映射 将是您更好的选择。

完成您想要的任务的唯一方法是构建一个触发器来处理服务器端的处理。您不能将这样的 FK 映射到多个表。但触发器可以处理该逻辑。当然,这完全超出了EF的范围...

我还建议您为每种类型构建一个单独的表。我认为从长远来看更容易维护。

好吧,我想我会使用 Inferis 的建议并为每种类型创建一个单独的表。

谢谢你们的回答 - 他们很有帮助 很多 :)

在 SQL 中,您可以基于单个表为每种类型创建视图。每个视图都可以执行联接来检索与该类型相关的信息。这也使您可以将链接视为一个整体,而忽略其类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top