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();
}
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);
}
}
エンティティ接続文字列ではなく、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();
}
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
このコードを試してください
App.configファイルを使用してみてください。次に、名前で目的の接続文字列を呼び出します。
using System.Configuration;
public ProcessContext()
: base(ConnectionString("foo"))
{
}
private static string ConnectionString(string connKey)
{
var conn = ConfigurationManager.ConnectionStrings[connKey].ConnectionString;
return conn;
}
この方法は私にとってはうまくいきました。 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);
}
}