我正在创建一个需要在单个数据库中构建的多租户应用程序。为了对表进行分区,我们有一个Tenant
实体,其主键将作为需要分区的其他表的键的一部分引用。 Tenant
实体如下所示:
public class Tenant
{
[Key]
public string TenantId { get; set; }
public string TenantName { get; set; }
}
使用此分区的示例位于Store
- Item
方案中,其中租户可以拥有多个商店以及多个商品。商店可以有多个商品,他们的关系在StoreItem
实体中维护。我们目前的实现如下:
商店实体
public class Store
{
[Key, Column(Order = 1)]
public string TenantId { get; set; }
[Key, Column(Order = 2)]
public string StoreId { get; set; }
[ForeignKey("TenantId")]
public virtual Tenant Tenant { get; set; }
}
项目实体
public class Item
{
[Key, Column(Order = 1)]
public string TenantId { get; set; }
[Key, Column(Order = 2)]
public string ItemId { get; set; }
[ForeignKey("TenantId")]
public virtual Tenant Tenant { get; set; }
}
StoreItem实体
public class StoreItem
{
[Key, Column(Order = 1)]
public string TenantId { get; set; }
[Key, Column(Order = 2)]
public string StoreId { get; set; }
[Key, Column(Order = 3)]
public string ItemId { get; set; }
[ForeignKey("TenantId")]
public virtual Tenant Tenant { get; set; }
[ForeignKey("StoreId")]
public virtual Store Store { get; set; }
[ForeignKey("ItemId")]
public virtual Item Item { get; set; }
}
当我们尝试构建数据库时,遇到了ff。错误:
StoreItem_Item_Target_StoreItem_Item_Source ::关系约束中的从属角色和主要角色中的属性数必须相同。
StoreItem_Store_Target_StoreItem_Store_Source ::关系约束中的从属角色和主要角色中的属性数必须相同。
我构建键的方式有什么问题? TenantId
是否应该作为其他实体的密钥的一部分被引用?
答案 0 :(得分:1)
问题在于,您使用[ForeignKey("ItemId")]
来描述StoreItem
和Item
之间的部分关系,但Item
有多个关键列。如果您需要TenantId
成为密钥的一部分 - 如果ItemId
足以唯一标识Item
记录,则不应该这样做 - 那么我认为您需要使用流畅的API来定义关系。
另一方面,我猜你不需要TenantId
作为Item
或Store
的关键列,这会大大简化事情。