我正在设计一个多租户应用程序。我有一个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; }
}
答案 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>