У меня есть библиотека классов со следующей структурой:
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
, но я не уверен, что это правильный путь ...