Entity Framework:条件外键

4
我在数据库中有以下模式:
BillingReferences (ReferencingType tinyint, ReferencingId tinyint, ReferencedType tinyint, ReferencedId tinyint, IsActive bit) - 所有字段(除了IsActive)都是唯一索引的一部分。
BillingType (BillingTypeId tinyint, Name varchar(50))
ReferencingType和ReferencedType是BillingTypes的外键。 BillingTypes包含以下行:
BillingTypeId | Name 1 | Labels
2 | Countries
3 | PaymentProviders
4 | PaymentOptions
5 | Banks
ReferecingId和ReferencedId表示以下实体之一的ID(取决于Referenced/Referencing Type):
Banks (BankId tinyint, Name varchar(50)) Countries (CountryId tinyint, Name varchar(50)) Labels (LabelId tinyint, Name varchar(50)) PaymentProviders (PaymentProviderId tinyint, Name varchar(50)) PaymentOptions (PaymentOptionId tinyint, Name varchar(50))
将来每个实体都将添加更多不同的列,但现在这就是简单的模式。
每个实体(除了国家)与国家之间存在(1-)的联系。 标签与银行、支付提供商和支付选项之间存在(1-)的联系。 支付提供商与支付提供商之间存在(1-*)的联系
因此,例如,如果我想将BankId 201的银行连接到CountryId 3003的国家中,则在BillingReferences中会有一个记录如下: ReferencingType = 5 ReferencingId = 201 ReferencedType = 2 ReferencedId = 3003 IsActive = 1
我们没有为每种类型的连接/参考表进行连接,因为考虑到可扩展性-如果我们想要添加另一个实体,我们只需添加其表并在BillingReferences和BillingType中添加记录即可。
问题是我无法在BillingReferences和每个实体之间配置有条件的外键,而且似乎我也无法使用EntityFramework进行配置/映射...

我找不到任何使用这种类型实现的教程或示例。我是否需要为每个连接创建一个参考表,还是有一种方法可以使用EntityFramework进行配置?

谢谢帮忙 :)

5个回答

1

据我所知,目前没有办法做到这一点。

除非你真的有充分的理由不这样做,否则我会为每种类型创建一个单独的表。你提到的考虑因素在我看来并不好。

拥有更多的表可以让你在键上放置外键约束,并且它可以很好地转换成 EF。它还有助于性能:如果你总是想要查询某个类型的所有引用,那么具有一百万行的大型引用表将比更小的表需要更长的查询时间。


除非您始终需要一个类型的所有引用,否则不要使用它。更或者说,我总是需要显示与特定银行相关联的所有国家,或者与特定标签相关联的所有银行。用户必须能够将任何实体与所选实体关联/取消关联。 - Captain

1

在Entity Framework中不仅没有办法做到这一点,而且在SQL中也无法做到。您不能有一个外键引用五个不同的表之一。

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


你可以说每个实体都有它自己特殊的列。 我刚刚描述了一个简化版本... 所以我不认为层次映射表适合我... - Captain
如果对于您在问题中未显示的部分更好,可以按类型进行表格。关键是使用超类型允许您在数据库中使用真正的外键,从而使EF为您提供所需的映射。 - Craig Stuntz
它是在Dynamics Business Central中完成的 - undefined

1
你想要实现的唯一方法是在服务器端构建触发器来处理处理过程。你不能像那样将FK映射到多个表中。但是触发器可以处理这种逻辑。当然,这完全超出了EF的范围...
我还建议您为每种类型构建单独的表。我认为从长远来看更容易维护。

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

0

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

谢谢大家的回答 - 它们帮了我很多 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接