Произошла ошибка активации при попытке получить экземпляр типа базы данных, ошибка возникает только при динамическом создании строки подключения.

У меня есть фрагмент кода (.NET Framework 4.5.2, Enterprise Library 5.0.505.0), где мне нужно подключиться к базе данных SQL Server. Однако имя БД может меняться в зависимости от требований пользователя. Итак, у меня есть следующий фрагмент кода для динамической записи строки подключения в файл app.config.

public void CreateNewConnectionStringInConfig(string initialCatalog)
{
      SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
      builder.DataSource = ConfigurationManager.AppSettings["Data Source"];
      builder.PersistSecurityInfo = true;
      builder.InitialCatalog = initialCatalog; //This is the DB name
      builder.UserID = ConfigurationManager.AppSettings["User ID"];
      builder.Password = ConfigurationManager.AppSettings["Password"];

      // Get the application configuration file.
      Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

      // Create a connection string element.
      ConnectionStringSettings csSettings = new ConnectionStringSettings("UserSelectedConnectionString", builder.ConnectionString, "System.Data.SqlClient");

      // Get the connection strings section.
      ConnectionStringsSection csSection = config.ConnectionStrings;

      // Add the new element.
      csSection.ConnectionStrings.Add(csSettings);

      // Save the configuration file.
      config.Save(ConfigurationSaveMode.Modified);

     // Refresh the section so the new configuration can be re-read
      ConfigurationManager.RefreshSection("connectionStrings");

}

Я проверил, и строка подключения создается нормально в файле vshost.exe.Config во время отладки. Однако, когда я пытаюсь создать объект базы данных, я получаю сообщение об ошибке. Код, используемый для создания объекта БД, показан ниже.

public class MyDac
{
    private readonly Database _db;

    public MyDac()
    {
        DatabaseProviderFactory factory = new DatabaseProviderFactory();
        _db = factory.Create("UserSelectedConnectionString");
    }
}

Я получаю следующую ошибку при попытке создать объект _db.

Activation error occured while trying to get instance of type Database, key "UserSelectedConnectionString"

Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured while trying to get instance of type Database, key "UserSelectedConnectionString" --->     Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Data.Database", name = "UserSelectedConnectionString".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The type Database does not have an accessible constructor.

Вещи, которые я пробовал:

1) Обновление версии Enterprise Library до 6.0.0.0 решает проблему, но мне это не подходит. Я должен сохранить его до версии 5.0.505.0.

2) Когда я заранее жестко кодирую строку подключения в файле App.config (вместо того, чтобы писать ее во время выполнения), приложение работает нормально. Однако в реальной жизни я не могу этого сделать, потому что имя базы данных будет постоянно меняться.

Любая помощь будет высоко ценится. Спасибо!


person Anish Chakraborty    schedule 07.06.2016    source источник


Ответы (1)


Я изменил свой код, как показано ниже, и он начал работать. Однако у меня нет никакого объяснения этому:

public class MyDac
{
    private readonly Database _db;

    public MyDac()
    {
        _db = new SqlDatabase("UserSelectedConnectionString");
    }
}
person Anish Chakraborty    schedule 16.06.2016