那么,这个帖子有点老了,但也许我的答案仍然有用。
Q1:SubSonic Migrations是由子指令(sonic.exe)在运行时编译和执行的代码文件,这意味着代码文件必须位于磁盘上并且必须遵循命名约定001_migration_name.cs,以便子指令员知道执行订购。
Q2:你不需要msbuild进行迁移。你需要的唯一东西是sonic.exe和它的依赖关系。
问题3:创建自己的logik可以(并不是很难)在运行时执行项目中的迁移,而无需使用子命令。
我基本上找到每一个派生自迁移的类,(因为一个类不能以数字开头),我的约定是类名的最后3位数是迁移编号(就像001_migration_name.cs,我的类是定义为Migration001:迁移)
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经验,但如果你的应用程序使用亚音速比亚音速的迁移是一个很好的choise,因为你不需要部署任何额外的库。
问题5:您可以使用亚音速迁移。只需要:
Execute("CREATE TABLE ...");
在Up()或Down()方法中。但是使用预定义方法的优点是(除了它们跨越多个dbms工作的事实,如果你只使用sqlite,这个工作并不重要),就是你有一些预先飞行检查(例如,如果你定义了一个迁移将会失败字段执行实际的sql之前两次)