Ну, пост немного старый, но, возможно, мои ответы по-прежнему используются.
Q1: SubSonic Migrations - это файлы кода, которые выполняются и выполняются во время выполнения подкомандом (sonic.exe), что означает, что файлы кода должны быть на диске и должны следовать соглашению об именах 001_migration_name.cs для подкоманда, чтобы знать выполнение заказ.
Q2: Для миграции не требуется msbuild. Единственное, что вам нужно, это sonic.exe и его зависимости.
Q3: Возможно (и не очень сложно) создать свой собственный логик для выполнения миграций в вашем проекте во время выполнения без использования подкоманды.
В основном я нахожу каждый класс, полученный из Migration, и (поскольку класс не может начинаться с числа) мое соглашение состоит в том, что последние 3 цифры из имени класса являются номером миграции (например, 001_migration_name.cs мои классы определяется как Migration001: Migration)
public class MigrationHelper
{
private const string providerName = "MyProviderName";
public static int CurrentVersion { get { return SubSonic.Migrations.Migrator.GetCurrentVersion(providerName); } }
private static Dictionary<int, Migration> _migrations;
public static Dictionary<int, Migration> Migrations
{
get
{
if (_migrations == null)
{
_migrations = new Dictionary<int, Migration>();
foreach (Type t in new MigrationHelper().GetType().Assembly.GetExportedTypes())
{
if (t.BaseType == typeof(SubSonic.Migration))
{
int number;
if (int.TryParse(t.Name.Substring(t.Name.Length - 3, 3), out number))
Migrations.Add(number, (Migration)Activator.CreateInstance(t));
else
throw new InvalidOperationException("Classes that inherit SubSonic Migrations have to be named MigrationXXX where x is the unique migration number");
}
}
}
return _migrations;
}
}
public static void ExecuteMigration(Migration m, Migration.MigrationDirection direction)
{
m.Migrate(providerName, direction);
}
}
в вашей программе вы можете определить текущую версию по MigrationHelper.CurrentVersion, а затем выполнить каждый переход от тока макс (если вы WANNE идти вверх) или какой-либо другой номер. Вот как вы его используете.
Migration m = MigrationHelper.Migrations[15];
MigrationHelper.ExecuteMigration(m, Migration.MigrationDirection.Up);
Q4: У меня нет опыта работы с MigratorDotNet, но если ваше приложение использует дозвуковое, чем дозвуковые миграции являются хорошим выбором, так как вам не нужно, чтобы развернуть дополнительную LIBS.
Q5: Вы можете использовать дозвуковые миграции для этого. Просто выполните:
Execute("CREATE TABLE ...");
в методе Up() или Down(). Но преимущество использования предопределенных методов (помимо того, что они работают через несколько dbms, которые могут быть не столь важными, если вы используете только sqlite), заключается в том, что у вас есть предварительные проверки (например, миграция не удастся, если вы определите поле дважды до того, как будет выполнен фактический sql)