Ef Core花里胡哨系列(3) 动态修改实体对应的表(分表)、多租户

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进行多租户管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖纸不争

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值