Во время обновления базы данных в реализации IDesignTimeDbContextFactory передана неверная строка подключения - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть библиотека классов со следующей структурой:

namespace Layers
{
  public class DatabaseLayer 
  {
      private Database _database;

      public string ConnectionString {get; set; }
  }
}

namespace Models
{
  public class DatabaseBase : DbContext, IDisposable
  {
    private DbConnection _connection;
    private DbCommand _command;

    public string ConnectionString {get; set; }
  }

  public class Database : DatabaseBase
  {
    internal Database(string connectionString) : base(connectionString) { }

    public virtual DbSet<FileEntity> Files { get; set; }
  }
}

Я добавил реализацию интерфейса IDesignTimeDbContextFactory, чтобы избежать сообщения Невозможно создать объект типа «База данных».Добавить реализацию IDesignTimeDbContextFactory в проект :

namespace Models
{
  public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<Database>
  {
    public Database CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<Database>();
        var connectionString = @"Server=MyInstanceName;Database=MyDatabaseName;Trusted_Connection=True;";

        builder.UseSqlServer(connectionString, b => b.MigrationsAssembly("MyAssemblyName"));

        return new Database(builder.Options.ToString());
    }
  }
}

Когда я пытаюсь запустить update-database -Context Database, я получаю

System.ArgumentException: Формат строки инициализации не соответствует спецификации, начиная с индекса 0. в System.Data.Common.DbConnectionOptions.GetKeyValuePair (строка String connectionString, Int32 currentPosition, StringBuilder, логическое значение useOdbcRules, String & keyname, String & keyvalue) в системе.Data.Common.DbConnectionOptions.ParseInternal (словарь 2 parsetable, String connectionString, Boolean buildChain, Dictionary 2 синонимов, логический firstKey) в System.Data.Common.DbConnectionOptions..ctor (String connectionString, словарь `2 синонимов)

Это очевиднопроблема в моем connectionString, но я скопировал его из тестового проекта как есть, и он хорошо работает там (тест соединений пройден).

Что я могу пропустить?Я использую EF Core и .NET Core 2.1.

Редактировать Я запускаю свой код в отладчике и вижу, что неверная строка соединения отправляет в Database конструктор:

Выбранная строка содержит правую строку подключения, а следующая - нет.Поэтому мой вопрос должен звучать так: как правильно отправить строку подключения из конструктора DbContextOptionsBuilder в DbContext.

Edit2: Я могу заставить его работать, заменив

return new Database(builder.Options.ToString());

с

return new Database((builder.Options.Extensions.First() as 
  SqlServerOptionsExtension).ConnectionString.ToString());

в CreateDbContext, но я не уверен, что это правильный путь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...