web-dev-qa-db-ja.com

EF6 DBContext動的接続文字列

public partial class ProcessContext : DbContext
{
    static ProcessContext()
    {
        Database.SetInitializer<ProcessContext>(null);
    }

    public ProcessContext()
        : base("Name=ProcessCS") //Comes from Config File
    {
    }

    --DBSets 
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
       --Code
    }
}

これは、3つの異なるDBがあるMulti Tenent DBです。集中DBは共通の場所にあり、変更されません。これは、残りのDB詳細が保存される場所です。この集中化されたDBから詳細が取得される接続文字列@ランタイムを作成する必要があります。誰かが私にそれについて行く方法を教えてもらえますか?

次のコードを試してみましたが、うまくいきません。このメソッドはここで呼び出されます

public ProcessContext()
    : base(nameOrConnectionString: ConnectionString())
{
}

private static string ConnectionString()
{
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
    sqlBuilder.DataSource = "XXX";
    sqlBuilder.InitialCatalog = "YYY";
    sqlBuilder.PersistSecurityInfo = true;
    sqlBuilder.IntegratedSecurity = true;
    sqlBuilder.MultipleActiveResultSets = true;

    EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
    entityBuilder.ProviderConnectionString = sqlBuilder.ToString();
    entityBuilder.Metadata = "res://*/";
    entityBuilder.Provider = "System.Data.SqlClient";

    return entityBuilder.ToString();
}
21
Gautham Nayak

SQL Server接続の場合、エンティティコンテナークラスをオーバーライドします(EF6、SQL Server 2012 Express、VS2013で動作)

public partial class PxxxxEntities
{
    private PxxxxEntities(string connectionString)
        : base(connectionString)
    {
    }

    public static PxxxxEntities ConnectToSqlServer(string Host, string catalog, string user, string pass, bool winAuth)
    {
        SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder
        {
            DataSource = Host,
            InitialCatalog = catalog,
            PersistSecurityInfo = true,
            IntegratedSecurity = winAuth,
            MultipleActiveResultSets = true,

            UserID = user,
            Password = pass,
        };

        // assumes a connectionString name in .config of MyDbEntities
        var entityConnectionStringBuilder = new EntityConnectionStringBuilder
        {
            Provider = "System.Data.SqlClient",
            ProviderConnectionString = sqlBuilder.ConnectionString,
            Metadata = "res://*/DbModel.csdl|res://*/DbModel.ssdl|res://*/DbModel.msl",
        };

        return new PxxxxEntities(entityConnectionStringBuilder.ConnectionString);
    }
}
24
albert

エンティティ接続文字列ではなく、DbContextコンストラクターに通常の接続文字列を渡す必要があります。したがって、次のようにコードを変更してみてください。

public ProcessContext()
    : base(ConnectionString())
{
}

private static string ConnectionString()
{
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
    sqlBuilder.DataSource = "XXX";
    sqlBuilder.InitialCatalog = "YYY";
    sqlBuilder.PersistSecurityInfo = true;
    sqlBuilder.IntegratedSecurity = true;
    sqlBuilder.MultipleActiveResultSets = true;

    return sqlBuilder.ToString();
}
14
luksan

Web.configを変更する必要があります

<connectionStrings>
<add name="DefaultConnection" connectionString="data source=mydb;initial catalog=mydatabase;persist security info=True;user id=sa;password=password;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
<add name="DataContext" connectionString="data source=mydb;initial catalog=mydatabase;persist security info=True;user id=sa;password=password;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
<!-- Here Add multiple database connection string  -->


ProcessContext.csファイルの1つのコンストラクターを変更してデフォルト接続を作成する必要がある場合

public ProcessContext()
      :base("name=DefaultConnection"){
        //here code
       }

データベースへの他のパラメーターコンストラクターの動的接続

public ProcessContext(string DynamicConnectionString)
       :base(DynamicConnectionString){
// herer code }

ここでデフォルト接続への接続は「DefaultConnection」ですが、任意のコントローラにコードを指定すると接続文字列があります

ProcessContext db=new ProcessContext();//this is default connection

ProcessContext db=new ProcessContext("DataContext");//dynamic change connection string 

このコードを試してください

3
Mehul Akabari

App.configファイルを使用してみてください。次に、名前で目的の接続文字列を呼び出します。

using System.Configuration;

public ProcessContext()
    : base(ConnectionString("foo"))
{
}

private static string ConnectionString(string connKey)
{
    var conn = ConfigurationManager.ConnectionStrings[connKey].ConnectionString;
    return conn;
}
1
Celso Jr

この方法は私にとってはうまくいきました。 app.configに別の名前付き接続文字列を追加し、次に示すように、その名前を以下のGetDbContext()静的メソッドに渡しました。

使用例:

var dbAlternate = PxxxxEntities.GetDbContext("PxxxxEntitiesAlternate")

プロジェクトに次を追加します。

public partial class PxxxxEntities
{
    private PxxxxEntities(string name)
        : base("name=" + name)
    {
    }

    public static PxxxxEntities GetDbContext(string name)
    {
        return new PxxxxEntities(name);
    }
}
1
dodgy_coder