Ef Core花里胡哨系列(3) 动态修改实体对应的表(分表)、多租户
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花里胡哨系列(3) 动态修改实体对应的表(分表)、多租户
Ef Core
在加载的时候,会执行一次OnModelCreating
用来加载所用到的实体。我们要做的就是刷新Ef Core
上下文中之前缓存的内容。
分表
我们假如有一个程序,会每个月创建一个Table年月
的表,我们要做的是每个月只查询当前月的表,更复杂的逻辑我们以后再来讨论,先了解基本的原理。
如何刷新DbContext
?
Ef Core
通过IModelCacheKeyFactory
来检查当前DbContext
是否发生了变化。如果发生了变化,将会重新执行一次OnModelCreating
。
那么事情就很简单了,我们需要自动或者手动让IModelCacheKeyFactory
产生的Key
发生变化,OnModelCreating
中做好对应的处理就可以了。
实现DbContext
将User
实体映射到User年月
的表上。
如果报错没有
ToTable
方法,添加Microsoft.EntityFrameworkCore.Relational
的引用即可。
public class SampleDbContext(DbContextOptions<SampleDbContext> options)
: DbContext(options)
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().ToTable($"User{DateTime.Now.ToString("yyyyMM")}");
base.OnModelCreating(modelBuilder);
}
}
实现IModelCacheKeyFactory
我这里做了简化处理,直接检测了当前月份的变化,也可以通过实现一个静态变量由外部动态改变。
public class MyModelCacheKeyFactory : IModelCacheKeyFactory
{
public object Create(DbContext context, bool designTime)
{
return DateTime.Now.ToString("yyyyMM");
}
}
替换DbContext
中的默认实现
services.AddDbContext<SampleDbContext>(opts =>
{
opts.ReplaceService<IModelCacheKeyFactory, MyModelCacheKeyFactory>();
});
多租户
利用这些类似的实现,我们可以实现基于分表的多租户,只需要将实体和租户标识映射到不同的表即可。
后面我会说明如何基于多库、Schema进行多租户管理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?