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