我必须设计一个多租户应用程序,我需要在同一模型中的每个租户自定义字段。
客户1需要使用一些自定义字段,客户2需要管理同一表中的其他字段,以此类推。
这是一个示例:同一个表(票证)有一个公共(基本)字段列表,那么每个租户在模型中都应该有自己的附加列:
我想实现一个EF代码优先的.Net核心web应用程序。
namespace Models.Base
{
public class TicketBase
{
public int Id { get; set; }
public string Description { get; set; }
public Datetime CreationDate { get; set; }
}
}租户1
namespace Models.Tenant1
{
public class Ticket : TicketBase
{
public string CustomerName { get; set; }
public Datetime DateCustomerCall { get; set; }
}
}租户2
namespace Models.Tenant2
{
public class Ticket : TicketBase
{
public string AnotherDescription { get; set; }
public Datetime AnotherDate { get; set; }
}
}以这种方式设计模型是正确的,还是有不同的方法来解决这个非常常见的问题?
发布于 2019-03-24 19:04:27
在SaaS中,拥有单一的代码库和灵活的多租户配置/扩展是成功的关键。
要为每个租户启用自定义字段,业务模型必须具有固定的基本字段集。自定义字段必须按entityid和tenantid存储在单独的表中。
您的表格可能类似于下面给出的表格。这种模型是首选的,因此具有通用扩展表将导致较低的可伸缩性,并且随着使用量的增加,可能很快就会被数据量填满。
票证
TicketExtn (包含租户和实体的自定义字段的扩展表)
TicketExtn表将包含如下字段
TicketId TenantId FieldId FieldValue FieldDataType等当我们尝试为Ticket实体获取数据时,我们还将从TicketExtn表中获取数据,并在模型中设置字段。
BaseModel将如下图所示
public class ExtendedField
{
public Guid Id { get; set; }
public string FieldName { get; set; }
public Guid DataTypeId { get; set; }
/// <summary>
/// Can also be a typed class, this is just for reference
/// </summary>
/// <value>The field value.</value>
public string FieldValue { get; set; }
/// <summary>
/// Incase of using string for fieldvalue, the string to format the value as per the required datatype
/// will be provided here.
/// </summary>
/// <value>The field value format string.</value>
public string FieldValueFormatString { get; set; }
}
public class BaseModel
{
Dictionary<string, ExtendedField> ExtendedRows { get; set; }
}
public class Ticket : BaseModel
{
public int Id { get; set; }
public string Description { get; set; }
public DateTime CreationDate { get; set; }
}在您的服务层中,将有用于填充这些扩展行的逻辑。最好具有用于填充扩展行的通用逻辑,以便对于任何数量的实体,此逻辑都可以重用。
HTH
https://stackoverflow.com/questions/55322140
复制相似问题