Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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# EF 6-运行时在模式之间切换_C#_Postgresql_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# EF 6-运行时在模式之间切换

C# EF 6-运行时在模式之间切换,c#,postgresql,entity-framework,entity-framework-6,C#,Postgresql,Entity Framework,Entity Framework 6,我正在用EF 6开发一个ASP.NET 4.6.2 Web应用程序。后端是几个模式中的PostgreSQL数据库:每个模式中的表和视图都完全相同。根据用户的操作,我必须专门连接到一个或另一个模式 通过重写OnModelCreating方法(但只重写一次),这可以很好地工作 如果用户想要更改其环境,我可以使用正确的参数实例化上下文,但它不调用OnModelCreating方法。上下文保存在某个地方,并连接到以前的模式 ->如何使上下文无效或强制切换到其他架构? 这是我的密码: public p

我正在用EF 6开发一个ASP.NET 4.6.2 Web应用程序。后端是几个模式中的PostgreSQL数据库:每个模式中的表和视图都完全相同。根据用户的操作,我必须专门连接到一个或另一个模式

通过重写OnModelCreating方法(但只重写一次),这可以很好地工作

如果用户想要更改其环境,我可以使用正确的参数实例化上下文,但它不调用OnModelCreating方法。上下文保存在某个地方,并连接到以前的模式

->如何使上下文无效或强制切换到其他架构?

这是我的密码:

  public partial class MyDB : DbContext
{
    public Instances Instance { get; set; }
    public string Schema
    {
        get
        {
            switch(Instance)
            {
                case Instances.I1:
                    return "schema1";
                case Instances.I2:
                    return "schema2";
                case Instances.I3:
                    return "schema3";
                case Instances.I4:
                    return "schema4";
                case Instances.I5:
                    return "schema5";
                default:
                    return "public";
            }
        }

    }

    public MyDB(bool Proxy, Instances Instance)
        : base("MyDB")
    {
        this.Configuration.ProxyCreationEnabled = Proxy;
        this.Instance = Instance;

        this.Database.Log = s => System.Diagnostics.Debug.Print(s);

    }



    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.HasDefaultSchema(Schema);
        modelBuilder.Conventions.Add(new FunctionsConvention<MyDB>(Schema));
    }

}
class NpgsqlConfiguration : DbConfiguration
{
    public NpgsqlConfiguration()
    {
        SetModelCacheKey(ctx => new EntityModelCacheKey((ctx.GetType().FullName + ctx.Database.Connection.ConnectionString).GetHashCode()));
        SetProviderServices("Npgsql", Npgsql.NpgsqlServices.Instance);
        SetProviderFactory("Npgsql", Npgsql.NpgsqlFactory.Instance);
        SetDefaultConnectionFactory(new Npgsql.NpgsqlConnectionFactory());
    }
}
公共部分类MyDB:DbContext
{
公共实例实例{get;set;}
公共字符串模式
{
得到
{
交换机(实例)
{
案例1.1:
返回“schema1”;
案例1.2:
返回“schema2”;
案例1.3:
返回“schema3”;
案例1.4:
返回“schema4”;
案例1.5:
返回“schema5”;
违约:
返回“公共”;
}
}
}
公共MyDB(bool代理、实例)
:base(“MyDB”)
{
this.Configuration.ProxyCreationEnabled=代理;
this.Instance=Instance;
this.Database.Log=s=>System.Diagnostics.Debug.Print;
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
hasdaultschema(Schema);
添加(新函数转换(模式));
}
}
类NpgsqlConfiguration:DbConfiguration
{
公共NpgsqlConfiguration()
{
SetModelCacheKey(ctx=>new EntityModelCacheKey((ctx.GetType().FullName+ctx.Database.Connection.ConnectionString.GetHashCode());
SetProviderServices(“Npgsql”,Npgsql.NpgsqlServices.Instance);
SetProviderFactory(“Npgsql”,Npgsql.NpgsqlFactory.Instance);
SetDefaultConnectionFactory(新的Npgsql.NpgsqlConnectionFactory());
}
}

谢谢你的帮助

它的简单用法是使用两个连接字符串

MyDB db;
if (user.Type == 1)
{
    db = new MyDb("nameOfConnectionString1");
}
else
{
    db = new MyDb("nameOfConnectionString2");
}
您可能需要为构造函数创建重载

public MyDB(string conStr, bool Proxy, Instances Instance)
    : base(conStr)

数据库是相同的,只是模式不同。我需要6个连接字符串
InitialCatalog
确定模式的名称。您可以在
.config
文件中添加多个连接字符串,也可以使用classI。我不想创建新的连接字符串,我想使用相同的上下文。