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進行多租戶管理。

浙公網安備 33010602011771號