【问题标题】:Change Database Schema Name at Runtime在运行时更改数据库模式名称
【发布时间】:2019-10-22 22:17:12
【问题描述】:

目前,在我的实体中,我有以下表格定义:

[Table("SchemaName.SomeTable")]

我需要能够在运行时更改此架构名称。我尝试分配一个变量,但它会引发错误。

作为第二次尝试,我删除了 Table 声明,而是在我的上下文的 OnModelCreating 中尝试使用以下内容进行设置:

modelBuilder.Entity<MY_VIEW>().ToTable("MYSCHEMA.MYVIEW");

这可行,但是,我现在希望能够在运行时通过我的控制器更改它,因为 OnModelCreating 只触发一次。

【问题讨论】:

    标签: c# asp.net oracle entity-framework


    【解决方案1】:

    为了使OnModelCreating 运行在不同的模式下,您需要覆盖IModelCacheKeyFactory 的默认行为

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
            {
                options.ReplaceService<IModelCacheKeyFactory, SchemaModelCacheKeyFactory>();
            });
        }
    }
    
    public class DatabaseOptions
    {
        public string Schema { get; set; }
    }
    
    public class ApplicationDbContext : DbContext
    {
        public string Schema { get; }
    
        public ApplicationDbContext(DbContextOptions options, IOptions<DatabaseOptions> databaseOptions)
            : base(options)
        {
            Schema = databaseOptions.Value.Schema;
        }
    
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<MY_VIEW>().ToTable($"{Schema}.MYVIEW");
        }
    }
    
    public class SchemaModelCacheKeyFactory : ModelCacheKeyFactory
    {
        public SchemaModelCacheKeyFactory(ModelCacheKeyFactoryDependencies dependencies)
            : base(dependencies)
        {
        }
    
        public override object Create(DbContext context)
        {
            if (context is ApplicationDbContext applicationDbContext)
            {
                return new SchemaModelCacheKey(context, applicationDbContext.Schema);
            }
            else
            {
                return base.Create(context);
            }
        }
    }
    
    public class SchemaModelCacheKey : ModelCacheKey
    {
        public SchemaModelCacheKey(DbContext context, string schema) : base(context)
        {
            _schema = schema;
        }
    
        private readonly string _schema;
    
        protected virtual bool Equals(SchemaModelCacheKey other) => _schema == other._schema && base.Equals(other);
    
        public override bool Equals(object obj) => (obj is SchemaModelCacheKey otherAsKey) && Equals(otherAsKey);
    
        public override int GetHashCode() => base.GetHashCode() + _schema.GetHashCode();
    }
    

    【讨论】:

    • 你能扩展一下代码吗?特别是关于如何导入 ModelCacheKeyFactory。
    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 2017-04-24
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2018-07-09
    相关资源
    最近更新 更多