EF 6 - 在运行时

时间:2018-03-14 10:23:09

标签: c# postgresql entity-framework entity-framework-6

我正在使用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());
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

简单使用两个连接字符串

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)