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 разных БД. Централизованная БД находится в общем месте и не будет изменена. Здесь будет храниться остальная часть данных БД. Мне нужно создать строку connection @runtime, где детали будут поступать из этой централизованной БД. Может кто-нибудь, пожалуйста, дайте мне знать, как это сделать?
Я пробовал со следующим кодом, но он не работает. Этот метод будет называться здесь
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();
}
Ответы
Ответ 1
Для подключения 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);
}
}
Ответ 2
Вы должны передать обычную строку соединения в конструктор 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();
}
Ответ 3
Вам нужно изменить 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
один конструктор для создания соединения по умолчанию
public ProcessContext()
:base("name=DefaultConnection"){
//here code
}
другое параметрирование конструктор динамическое соединение с базой данных
public ProcessContext(string DynamicConnectionString)
:base(DynamicConnectionString){
// herer code }
здесь для подключения по умолчанию "DefaultConnection", но у вас есть строка подключения chnage, заданная кодом любого контроллера
ProcessContext db=new ProcessContext();//this is default connection
ProcessContext db=new ProcessContext("DataContext");//dynamic change connection string
попробуйте этот код
Ответ 4
Этот метод работал хорошо для меня. Я просто добавил еще одну именованную строку соединения в свой 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);
}
}
Ответ 5
Попробуйте использовать файл app.config. Затем вызовите нужную строку соединения по ее имени:
using System.Configuration;
public ProcessContext()
: base(ConnectionString("foo"))
{
}
private static string ConnectionString(string connKey)
{
var conn = ConfigurationManager.ConnectionStrings[connKey].ConnectionString;
return conn;
}