我有一个为多个租户服务的asp.net核心Web。我有一个针对所有租户的单一PostgreSQL数据库。租户由TenantId列分隔,该列使用EF核心查询筛选器应用。我使用的是代码优先的迁移方法。所有这些都如预期的那样工作。
但是,我很困惑如何最好地管理每个租户的序列。例如,每个租户都可以有一个作业列表,每个作业都具有下一个增量值。我如何实现这一点,以便每个租户都有自己的增量作业编号集?
理想情况下,我不希望必须管理每个租户的序列,因为这很快就会变得难以管理。
是否有一种使用EF核心实现这一目标的“最佳实践”?或者,我是否需要手动/在迁移之外执行一些操作?
谢谢你的帮助/想法。
发布于 2022-10-03 15:20:47
我倾向于创建自己的Sequences表,该表与任何其他实体一样使用DbContext进行管理。然后创建一些管理获取下一个序列值的ISequenceService。最后,我实现了一个IStartupFilter,它将为每个租户插入应用程序所需的所有序列。此模式将与您的判别器列模式很好地匹配。
我的序列对象看起来类似于:
public class Sequence: BaseEntity {
public string name {get;set;}
public int nextValue {get;set;} = 1;
public string prefix {get;set;}
public string postfix {get;set;}
}我更喜欢这个路径,因为它提供了一个更不依赖于数据库的实现。它还允许围绕序列进行更多的租户定制,例如每个租户希望自己的序列从何处开始、修复前后或其他您的用户可以想到的东西。
这种方法的一个缺点是并发性。如果有两个用户同时尝试增加序列,则可能最终得到dupe序列值。一个实际的数据库序列可以更好地处理这个问题,但是使用EF并不是不可能的。
如果您对这种方法感兴趣,查看处理并发的文档。。
https://stackoverflow.com/questions/73937191
复制相似问题