4

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

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

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

计费类型 ID | 姓名

1 | 标签

2 | 国家

3 | 支付提供商

4 | 付款方式

5 | 银行

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

  • 银行(BankId tinyint,名称varchar(50)
  • 国家(CountryId tinyint,名称varchar(50)
  • 标签(LabelId tinyint,名称varchar(50)
  • PaymentProviders(PaymentProviderId tinyint,名称varchar(50)
  • PaymentOptions (PaymentOptionId tinyint , 名称varchar(50) )

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

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

例如,如果我想将 BankId 为 201 的银行连接到 CountryId 为 3003 的国家/地区,我将在 BillingReferences 中有一条如下所示的记录:ReferencingType = 5 ReferencingId = 201 ReferencedType = 2 ReferencedId = 3003 IsActive = 1

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

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

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

谢谢您的帮助 :)

4

5 回答 5

1

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

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

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

于 2009-03-03T10:10:18.187 回答
1

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

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

于 2009-03-03T12:59:08.627 回答
1

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

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

于 2009-07-31T22:13:32.203 回答
0

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

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

于 2009-03-03T14:45:21.927 回答
0

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

于 2017-07-19T03:03:42.573 回答