在多租户代码 - 第一实体框架中引用“分区表”外键

时间:2015-08-03 03:27:29

标签: entity-framework ef-code-first foreign-keys entity-relationship multi-tenant

我正在创建一个需要在单个数据库中构建的多租户应用程序。为了对表进行分区,我们有一个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是否应该作为其他实体的密钥的一部分被引用?

1 个答案:

答案 0 :(得分:1)

问题在于,您使用[ForeignKey("ItemId")]来描述StoreItemItem之间的部分关系,但Item有多个关键列。如果您需要TenantId成为密钥的一部分 - 如果ItemId足以唯一标识Item记录,则不应该这样做 - 那么我认为您需要使用流畅的API来定义关系。

另一方面,我猜你不需要TenantId作为ItemStore的关键列,这会大大简化事情。