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