如何在EF Core中實現IModelCacheKeyFactory

entity-framework-core schema

故事:在我們的多租戶應用程序(一個PostgreSql數據庫,多個模式)中,我們需要對多個模式使用一個DbContext。

我嘗試了什麼:持有緩存(Dictionary,其中key是模式名稱,value是該模式的上下文)。在為另一個模式設置新上下文時,我可以看到dbContext模式仍然設置為提供的先前模式。我假設上下文中的模型是由上下文類型在內部緩存的,所以這就是我看到這種行為的原因?

所以上面似乎沒有用,我發現實現IModelCacheKeyFactory應該可以解決問題。有誰知道應該怎麼進入Create方法呢?任何地方都沒有樣品或文件。

我發現: 在Entity Framework Core中動態更改模式,但它為EF6提供了答案,因此幫助不大。

一般承認的答案

這是一個例子:

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);

        // ...
    }
}

class MyModelCacheKeyFactory : IModelCacheKeyFactory
{
    public object Create(DbContext context)
        => new MyModelCacheKey(context);
}

class MyModelCacheKey : ModelCacheKey
{
    string _schema;

    public MyModelCacheKey(DbContext context)
        : base(context)
    {
        _schema = (context as MyDbContext)?.Schema;
    }

    protected override bool Equals(ModelCacheKey other)
        => base.Equals(other)
            && (other as MyModelCacheKey)?._schema == _schema;

    public override int GetHashCode()
    {
        var hashCode = base.GetHashCode() * 397;
        if (_schema != null)
        {
            hashCode ^= _schema.GetHashCode();
        }

        return hashCode;
    }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow