Ef Core花里胡哨系列(4) 多租户
1.Ef Core花里胡哨系列(2) 移除外键、扩展操作2.Ef Core花里胡哨系列(1) SafeDelete、ReadOnly、Audit 安全删除、只读、审计等3.Ef Core花里胡哨系列(3) 动态修改实体对应的表(分表)、多租户
4.Ef Core花里胡哨系列(4) 多租户
5.Ef Core花里胡哨系列(5) 动态修改追踪的实体、动态查询6.Ef Core花里胡哨系列(6) XML注释同步到数据库注释7.Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?8.Ef Core花里胡哨系列(8) 如何可控管理Ef Core的迁移?9.Ef Core花里胡哨系列(9) 阴影属性,有用还是没用?10.Ef Core花里胡哨系列(10) 动态起来的 DbContext11.Ef Core花里胡哨系列(11) ef8 无实体查询,你好!Ef Core花里胡哨系列(4) 多租户
当然,我们要考虑设计问题,例如,切换
Schema
或者改变数据库时,Ef Core
同样也会刷新改实体的缓存,所以,首次查询将会很慢,不适合大表。
基于Schema
实现多租户
在我的上一篇博客中 [Ef Core花里胡哨系列(3) 动态修改实体对应的表(分表)、多租户]
中我们实现了如何分表,同理,我们可以用近似的方法来切换表的Schema
,只需要一点很小的改动。
public class SampleDbContext(DbContextOptions<SampleDbContext> options)
: DbContext(options)
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().ToTable($"User{DateTime.Now.ToString("yyyyMM")}", YourSchema);
base.OnModelCreating(modelBuilder);
}
}
基于多库实现多租户
实现切换数据库我们将会采用的是Interceptor
拦截器来实现。
建议租户相关的操作采用单独的
DbContext
和系统表区分开。
public class TenantDbConnectionInterceptor<T> : DbConnectionInterceptor
{
public TenantDbConnectionInterceptor()
{
}
public override InterceptionResult ConnectionOpening(DbConnection connection, ConnectionEventData eventData, InterceptionResult result)
{
connection.ConnectionString = "对应租户的连接字符串";
return base.ConnectionOpening(connection, eventData, result);
}
public override ValueTask<InterceptionResult> ConnectionOpeningAsync(DbConnection connection, ConnectionEventData eventData, InterceptionResult result, CancellationToken cancellationToken = default)
{
connection.ConnectionString = "对应租户的连接字符串";
return base.ConnectionOpeningAsync(connection, eventData, result, cancellationToken);
}
}
使用拦截器
services.AddDbContext<DynamicDbContext>(opts =>
{
opts.AddInterceptors(new TenantDbConnectionInterceptor());
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?