Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时更改数据库架构名称_C#_Asp.net_Oracle_Entity Framework - Fatal编程技术网

C# 在运行时更改数据库架构名称

C# 在运行时更改数据库架构名称,c#,asp.net,oracle,entity-framework,C#,Asp.net,Oracle,Entity Framework,目前,在我的实体中,我有以下表格定义: [Table("SchemaName.SomeTable")] 我需要能够在运行时更改此架构名称。我尝试分配一个变量,但它抛出了一个错误 作为第二次尝试,我删除了表声明,而是在上下文的OnModelCreating中尝试使用以下内容设置它: modelBuilder.Entity<MY_VIEW>().ToTable("MYSCHEMA.MYVIEW"); modelBuilder.Entity().ToTable(“MYSCHEMA.MY

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

[Table("SchemaName.SomeTable")]
我需要能够在运行时更改此架构名称。我尝试分配一个变量,但它抛出了一个错误

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

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

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

为了使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();
}
公共类启动
{
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(选项=>
{
options.ReplaceService();
});
}
}
公共类数据库选项
{
公共字符串架构{get;set;}
}
公共类ApplicationDbContext:DbContext
{
公共字符串架构{get;}
公共应用程序DBContext(DbContextOptions选项、IOOptions数据库选项)
:基本(选项)
{
Schema=databaseOptions.Value.Schema;
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity().ToTable($“{Schema}.MYVIEW”);
}
}
公共类SchemaModelCacheKeyFactory:ModelCacheKeyFactory
{
公共SchemaModelCacheKeyFactory(ModelCacheKeyFactoryDependencies)
:base(依赖项)
{
}
公共重写对象创建(DbContext上下文)
{
if(上下文为ApplicationDbContext ApplicationDbContext)
{
返回新的SchemaModelCacheKey(上下文,applicationDbContext.Schema);
}
其他的
{
返回base.Create(上下文);
}
}
}
公共类SchemaModelCacheKey:ModelCacheKey
{
公共SchemaModelCacheKey(DbContext上下文,字符串架构):基(上下文)
{
_模式=模式;
}
私有只读字符串_模式;
受保护的虚拟bool Equals(SchemaModelCacheKey-other)=>\u schema==other.\u schema&&base.Equals(other);
public override bool Equals(object obj)=>(obj是SchemaModelCacheKey otherAsKey)&&Equals(otherAsKey);
public override int GetHashCode()=>base.GetHashCode()+_schema.GetHashCode();
}

您能详细介绍一下代码吗?特别是关于如何导入ModelCacheKeyFactory。