实体框架:有条件的外键

时间:2009-03-03 09:59:52

标签: entity-framework mapping foreign-keys many-to-many conditional

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

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

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

BillingTypeId |名称

1 |标签

2 |国家

3 | PaymentProviders

4 | PaymentOptions

5 |银行

ReferecingId和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- )的关联。 标签与(1 - )连接到Banks,PaymentProviders和PaymentOptions。 并且PaymentProviders与(1- *)到PaymentProviders

的连接

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

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

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

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

感谢您的帮助:)

5 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

不仅没有办法在Entity Framework中执行此操作,也无法在SQL中执行此操作。您不能拥有引用五个不同表中的一个的外键。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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