【问题标题】:How to implement IModelCacheKeyFactory in EF Core如何在 EF Core 中实现 IModelCacheKeyFactory
【发布时间】:2017-02-01 11:56:55
【问题描述】:

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

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

所以上面似乎不起作用,我发现实现 IModelCacheKeyFactory 应该可以解决问题。有谁知道Create 方法应该包含什么?任何地方都没有样本或文档。

我发现了什么: Dynamically changing schema in Entity Framework Core 但它回答了 EF6,所以帮助不大。

【问题讨论】:

    标签: schema entity-framework-core


    【解决方案1】:

    这是一个例子。

    派生的 DbContext 将其 ModelCacheKey(和工厂)替换为自定义。

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

    每个上下文的自定义 ModelCacheKey。

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

    【讨论】:

      【解决方案2】:

      实际上在文档https://github.com/aspnet/EntityFramework.Docs/tree/master/samples/core/DynamicModel 中有演示项目,为了方便添加帖子!

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-14
      • 2021-12-04
      • 2018-11-20
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 2020-04-16
      • 2021-10-29
      相关资源
      最近更新 更多