Подтвердить что ты не робот

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();
}
4b9b3361

Ответ 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;
}