在EF Core中使用共享模式配置多租户的正确方法是什么

时间:2018-11-26 17:33:40

标签: c# .net multi-tenant

我正在设计一个多租户应用程序。我有一个Tenant实体,一个User实体以及其他多个具有TenantId属性的实体。

我开始将子引用添加到我的Tenant实体中,但是通过查看其他代码示例,我相信这不是让子实体正确注册TenantId外键的“正确”方法。但是,如果我不将子集合添加到我的Tenant实体中,则迁移不会将TenantId外键注册到子项。

以共享模式多租户模式管理这些关系的正确(或建议)方法是什么?

例如,假设我有一个租户,并且所有用户都可以访问其租户中的出租车,车库和区域。

注意:我在真实代码中使用了基类,但是决定使示例复杂化,所以我故意将所有内容拼写清楚。

public class Tenant
{
    public long Id { get; set; }
    public string Name { get; set; }
    public ICollection<User> Users { get; set; }

    // Should the below properties be left out?
    public ICollection<Taxi> Taxis { get; set; }
    public ICollection<Garage> Garages { get; set; }
    public ICollection<Zone> Zones { get; set; }
}

public class User
{
    public long Id { get; set; }
    public long TenantId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

public class Taxi
{
    public long Id { get; set; }
    public long TenantId { get; set; }
    public string Name {get; set; }
}

public class Garage
{
    public long Id { get; set; }
    public long TenantId { get; set; }
    public string Name { get; set; }
}

public class Zone
{
    public long Id { get; set; }
    public long TenantId { get; set; }
    public string Name { get; set; }
}

1 个答案:

答案 0 :(得分:1)

如果像下面给出的模型那样,您将在虚拟模型中拥有一个租户,

public class User
{
    public long Id { get; set; }
    public long TenantId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public virtual Tenant TenantDetails {get;set;}
}

您可能需要将所有从属实体写成一个租户。

但是,如果不是这种情况,则不必将依赖实体用作租户实体下的子代。通常,我们认为租户是应用程序或更高级别域对象的元数据。诸如业务对象之类的其余实体可以具有 Tenant 属性来标识记录的租户详细信息,但是恕我直言,从EF建模的角度来看,实时使用并不需要反之亦然。< / p>