我正在研究一个面向SaaS概念的多租户数据库模式设计。它将采用ASP.NET MVC -> EF,但这不是那么重要。
下面您可以看到一个示例数据库模式(租户是公司)。CompanyId在整个模式中被复制,并且主键已经放置在自然键和租户ID上。
将此模式插入实体框架时,在将表添加到实体模型文件(Model1.edmx)中时会出现以下错误:
关系“FK_Order_Customer”使用了部分包含在表“Order”的主键集合“{OrderId,CompanyId}”中的外键集合“{CustomerId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_OrderLine_Customer”使用了部分包含在表“OrderLine”的主键集合“{OrderLineId,CompanyId}”中的外键集合“{CustomerId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_OrderLine_Order”使用了部分包含在表“OrderLine”的主键集合“{OrderLineId,CompanyId}”中的外键集合“{OrderId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_Order_Customer”使用了部分包含在表“Order”的主键集合“{OrderId,CompanyId}”中的外键集合“{CustomerId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_OrderLine_Customer”使用了部分包含在表“OrderLine”的主键集合“{OrderLineId,CompanyId}”中的外键集合“{CustomerId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_OrderLine_Order”使用了部分包含在表“OrderLine”的主键集合“{OrderLineId,CompanyId}”中的外键集合“{OrderId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_OrderLine_Product”使用了部分包含在表“OrderLine”的主键集合“{OrderLineId,CompanyId}”中的外键集合“{ProductId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。
下面您可以看到一个示例数据库模式(租户是公司)。CompanyId在整个模式中被复制,并且主键已经放置在自然键和租户ID上。
将此模式插入实体框架时,在将表添加到实体模型文件(Model1.edmx)中时会出现以下错误:
关系“FK_Order_Customer”使用了部分包含在表“Order”的主键集合“{OrderId,CompanyId}”中的外键集合“{CustomerId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_OrderLine_Customer”使用了部分包含在表“OrderLine”的主键集合“{OrderLineId,CompanyId}”中的外键集合“{CustomerId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_OrderLine_Order”使用了部分包含在表“OrderLine”的主键集合“{OrderLineId,CompanyId}”中的外键集合“{OrderId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_Order_Customer”使用了部分包含在表“Order”的主键集合“{OrderId,CompanyId}”中的外键集合“{CustomerId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_OrderLine_Customer”使用了部分包含在表“OrderLine”的主键集合“{OrderLineId,CompanyId}”中的外键集合“{CustomerId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_OrderLine_Order”使用了部分包含在表“OrderLine”的主键集合“{OrderLineId,CompanyId}”中的外键集合“{OrderId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。 关系“FK_OrderLine_Product”使用了部分包含在表“OrderLine”的主键集合“{OrderLineId,CompanyId}”中的外键集合“{ProductId,CompanyId}”。 外键集必须完全包含在主键集中,或者完全不包含在主键集中才能映射到模型。
这个问题分为两个部分:
- 我的数据库设计是否有误?我应该避免使用复合主键吗?我对基本模式设计感到怀疑(头脑混乱综合症)。请随意建议“理想化”的模式。
- 或者,如果数据库设计正确,那么 EF 是否无法匹配键,因为它将这些外键视为潜在的错误配置的 1:1 关系(不正确)?如果是这样,这是一个 EF 的 bug,并且我应该如何解决?