EF6 Настройка строки подключения во время выполнения с помощью строки подключения без параметров

#c# #mysql #.net #entity-framework #model-view-controller

#c# #mysql #.net #entity-framework #модель-представление-контроллер

Вопрос:

У меня есть пользовательский класс DbContext и чтение строки подключения из текстового файла и строки подключения DbContext во время выполнения.Например ;

 [SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly")]
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public partial class ASDbContext : IdentityDbContext<ASUser, ASRole, int, ASUserLogin, ASUserRole, ASUserClaim>, IDbContext
{
    private readonly IConnectionStringManager _connectionStringManager;

    public ASDbContext(IDatabaseInitializer<ASDbContext> dbInitializer,
        IDbCommandInterceptor dbCommandInterceptor,
        IConnectionStringManager connectionStringManager) : base() 
    {
        this._connectionStringManager = connectionStringManager;

        if (!_connectionStringManager.CheckIfConnectionStringExists())
        {
            return;
        }
        this.Database.Connection.ConnectionString = _connectionStringManager.ReadConnectionString().;
        System.Data.Entity.Database.SetInitializer(dbInitializer);
        this.Configuration.ProxyCreationEnabled = false;
        DbInterception.Add(dbCommandInterceptor);
    }
     //...                       
}
  

Это работает с Sql Server.Однако это не работает с mysql. Следующая строка вызывает исключение ;

  this.Database.Connection.ConnectionString = _connectionStringManager.ReadConnectionString().ConnectionString;
  

[Исключение ArgumentException: формат строки инициализации не соответствует спецификации, начиная с индекса 0.]
System.Data.Обычный.DbConnectionOptions.GetKeyValuePair(строка ConnectionString, текущая позиция Int32, буфер StringBuilder, логические useOdbcRules, строка и ключевое имя, строка и ключевое значение) 1739
System.Data.Обычный.DbConnectionOptions.ParseInternal(анализируемая хеш-таблица, строка ConnectionString, логическая цепочка построения, синонимы хеш-таблицы, логический первый ключ) 191
System.Data.Обычный.DbConnectionOptions..ctor(строка ConnectionString, синонимы хэш-таблицы, логические useOdbcRules) 136
System.Data.Обычный.DbConnectionStringBuilder.set_ConnectionString(строковое значение) 87
MySQL.Data.MySqlClient.MySqlConnectionStringBuilder..ctor(строка connStr) 81
MySQL.Data.MySqlClient.MySqlConnection.set_ConnectionString(строковое значение) 382
MySQL.Data.Entity.MySqlConnectionFactory.createConnection(строка ConnectionString) 38
System.Data.Entity.Внутренний.LazyInternalConnection.Инициализировать() 398
System.Data.Entity.Внутренний.LazyInternalConnection.get_Connection() 16

Решение, которое я придумал, заключается в передаче фиктивной строки подключения конструктору базового класса DbContext. Например ;

 [SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly")]
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public partial class ASDbContext : IdentityDbContext<ASUser, ASRole, int, ASUserLogin, ASUserRole, ASUserClaim>, IDbContext
{
    private readonly IConnectionStringManager _connectionStringManager;

    // Passing "S=;" as connection string is a dirty workaround
    public ASDbContext(IDatabaseInitializer<ASDbContext> dbInitializer,
        IDbCommandInterceptor dbCommandInterceptor,
        IConnectionStringManager connectionStringManager) : base("S=;") 
    {
        this._connectionStringManager = connectionStringManager;

        if (!_connectionStringManager.CheckIfConnectionStringExists())
        {
            return;
        }
        this.Database.Connection.ConnectionString = _connectionStringManager.ReadConnectionString().;
        System.Data.Entity.Database.SetInitializer(dbInitializer);
        this.Configuration.ProxyCreationEnabled = false;
        DbInterception.Add(dbCommandInterceptor);
    }
     //...                       
}
  

Хотя это работает, мне не нравится устранять проблему с помощью грязного обходного пути, такого как передача фиктивной строки подключения.
Есть ли другой способ исправить эту ошибку?