Я хочу выполнить (сначала код) миграцию, используя строку подключения, которую я создал сам.
Точка входа — это статическая функция с одним параметром — connectionString.
У меня есть класс DbContext с именем PocModel с конструктором по умолчанию.
public PocModel() : base("PocModel")
{ ...
И конструктор контекста со строковым аргументом:
public PocModel(string nameOrConnectionString): base(nameOrConnectionString)
{ ...
Моя цель — выполнить миграцию базы данных, на которую нацелена строка подключения, а не строка подключения, которую EF «волшебным образом» создает только с помощью имени (localhost\sqlexpress — PocModel).
Этого я не смог сделать.
У меня есть "внешняя" функция, объявленная следующим образом:
public static void MigrateDatabase(string connectionString)
{ ...
Эту функцию я пытался реализовать в файле flw. способы:
DbMigrator migrator = new DbMigrator(new Migrations.Configuration());
migrator.Configuration.TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient");
migrator.Update();
А вот так:
Database.DefaultConnectionFactory = new SqlConnectionFactory(connectionString);
Database.SetInitializer<PocModel>(new MigrationInitializer());
PocModel model = new PocModel(connectionString);
model.Dispose();
Я даже пытался динамически установить
ConfigurationManager.ConnectionString["PocModel"]
В переданную строку подключения.
Но, увы, все терпит неудачу, и конструктор PocModel по умолчанию вызывается из кода миграции EF, ориентируясь на server:localhost\sqlexpress и базу данных:PocModel.
Мне не удалось выполнить миграцию в какую-либо базу данных без имени «PocModel», находящуюся на «localhost\sqlexpress».
Я не могу использовать файл app.config для установки моей строки подключения, так как мне нужно передать это через статическую внешнюю функцию.
Помогите пожалуйста, очень долго мучаюсь с этой проблемой.
РЕДАКТИРОВАТЬ: я заставил его работать с помощью этого взлома, но я задаю вопрос, чтобы убедиться, что действительно нет другого решения проблемы (иначе миграция EF ошибочна)
private static string _databaseNameOrConnectionString = "PocModel";
internal static string DatabaseNameOrConnectionString
{
get { return _databaseNameOrConnectionString; }
//HACK: This setter must ONLY be called from SetupModule.MigrateDatabase. It is a hack to circumvent the code-first migrations usage of this ctor.
set { _databaseNameOrConnectionString = value; }
}
//the code first migrations will call this ctor and ignore the connectionString it have been passed.
public PocModel()
: base(DatabaseNameOrConnectionString)
{