.NET миграции: настройка и миграция нескольких баз данных во время выполнения
Краткое введение: у меня есть этот сайт ASP.NET Webforms с той особенностью, что у него не только одна база данных, но и много. Зачем? Потому что вы можете создавать новые "экземпляры" сайта на лету. Каждый "экземпляр" использует одну и ту же кодовую базу, но имеет свою собственную базу данных. Все эти базы данных имеют одинаковую схему (структуру), но, конечно, разные данные. Не спрашивайте "почему вы не помещаете все в одну базу данных и не используете InstanceId, чтобы узнать, что это такое", потому что это бизнес-политика.
Приложение знает, какой экземпляр запрашивается из-за URL. Для этого есть одна дополнительная база данных (я знаю ее строку подключения во время разработки). Эта база данных имеет только 2 таблицы и ассоциирует URL с "экземплярами приложения". Затем, конечно, каждый "экземпляр приложения" имеет свою связанную строку подключения.
Текущая ситуация: сейчас ничего не используется, чтобы помочь нам в работе по синхронизации каждой базы данных экземпляра (распространение схемы изменяет каждую). Так что мы делаем это вручную, что, конечно, является полным беспорядком.
Вопрос: Я хотел бы использовать способ рельсовой миграции для обработки изменений схемы, предпочтительно migratordotnet, но мог бы использовать любой другой, если его проще настроить.
Проблема состоит в том, что migratordotnet нуждается в строке соединения, которая будет объявлена в файле proj.build, и я не знаю их до времени выполнения.
Что было бы ДЕЙСТВИТЕЛЬНО полезно, так это какой-то метод, работающий в Application_Start, который применяет последнюю миграцию к каждой базе данных.
Как это можно сделать с помощью migratordotnet или чего-либо подобного? Любые другие предложения приветствуются.
Спасибо!
4 ответа
Поскольку это старый вопрос, я предполагаю, что вы решили проблему тем или иным образом, но в любом случае я опубликую решение для блага других людей, которые наткнулись на этот вопрос. Можно вызвать MigratorDotNet из кода, а не использовать его в качестве цели MSBuild:
public static void MigrateToLastVersion(string provider, string connectionString)
{
var silentLogger = new Logger(false, new ILogWriter[0]);
var migrator = new Migrator.Migrator(provider, connectionString,
typeof(YourMigrationAssembly).Assembly, false, silentLogger);
migrator.MigrateToLastVersion();
}
Вы можете использовать Mig# для поддержки ваших миграций в коде C# или.NET: https://github.com/dradovic/MigSharp