如何在EF Core中实现IModelCacheKeyFactory

Tom*_*cek 5 schema entity-framework-core

故事:在我们的多租户应用程序(一个PostgreSql数据库,多个模式)中,我们需要对多个模式使用一个DbContext.

我尝试了什么:持有缓存(Dictionary,其中key是模式名称,value是该模式的上下文).在为另一个模式设置新上下文时,我可以看到dbContext模式仍然设置为提供的先前模式.我假设上下文中的模型是由上下文类型在内部缓存的,所以这就是我看到这种行为的原因?

所以上面似乎没有用,我发现实现IModelCacheKeyFactory应该可以解决问题.有谁知道应该怎么进入Create方法呢?任何地方都没有样品或文件.

我发现: 在Entity Framework Core中动态更改模式,但它为EF6提供了答案,因此帮助不大.

bri*_*lam 13

这是一个例子:

class MyDbContext : DbContext
{
    public MyDbContext(string schema)
    {
        Schema = schema;
    }

    public string Schema { get; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options
            .UseSqlServer("...")
            .ReplaceService<IModelCacheKeyFactory, MyModelCacheKeyFactory>();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema(Schema);

        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 用于根据“MyDbContext.Schema”的值进行识别的整个类“MyModelCacheKey”可以替换为更简单的“ValueTuple”,如 https://learn.microsoft.com/en-us/ef/core/ 中所述。建模/动态模型 (2认同)