SubSonic делает то, что вам нужно. У него есть класс миграции для использования с sonic commander. Я изменил код и поместил его в автозагрузку моих приложений, чтобы он проверял разницу версий и обновлялся автоматически.
Вот как вам нужно его настроить:
- Вам необходимо добавить версионный класс миграции. Возможно, вы захотите взглянуть на этот учебник , если вы никогда раньше не пользовались SubSonic. Следующий класс сохраняется как \ Migrations \ 001_initial.cs. Если вы вызвали migrate.exe (внутри VS) из subsonic, он обновит текущую базу данных до последней доступной версии. Для правильной работы migrate.exe необходимо сохранить префикс версии из 3 цифр в качестве имени файла, как указано в руководстве. Что касается имени класса, префикс версии с подчеркиванием и 3 цифрами необходим для написанного мной класса миграции, чтобы правильно определить версию.
// * Не уверен, зачем мне нужна эта строка, чтобы код работал ниже
namespace MyApps.Migrations
{
public class _001_Initial : Migration
{
public override void Up()
{
//Execute your upgrade query here
}
public override void Down()
{
//Execute your downgrade query here
}
}
}
- Вызывается CheckForMigration () во время запуска вашего приложения. IsUpdateAvailable будет указывать, что вам нужно обновить базу данных. Вам просто нужно позвонить Migrate (). IsAppVersionOlder указывает, что ваше приложение создано с использованием более старой версии схемы БД (возможно, другая копия более новых приложений обновила БД). С его помощью вы можете предотвратить запуск и повреждение старых приложений старыми приложениями.
//
using System;
using System.Collections.Generic;
using SubSonic;
using SubSonic.Migrations;
namespace MyApps.Migrations
{
internal static class MigrationHelper
{
const string NameSpace = "MyApps.Migrations";
private const string SCHEMA_INFO = "SubSonicSchemaInfo";
public static int CurrentVersion { get { return currentVersion; } }
public static int AppVersion { get { return latestVersion; } }
public static bool IsUpdateAvailable { get { return (updateVersion.Count > 0); } }
public static bool IsAppVersionOlder { get; private set; }
public static bool Checked { get; internal set; }
private static int currentVersion;
private static int latestVersion;
private static List<string> updateVersion;
private static List<string> availableVersion;
static MigrationHelper()
{
Checked = false;
}
/// <summary>
/// Migrates the specified migration directory.
/// </summary>
public static void CheckForMigration()
{
currentVersion = Migrator.GetCurrentVersion("YourProviderName");
Type[] allTypes =
System.Reflection.Assembly.GetExecutingAssembly().GetTypes();
availableVersion = new List<string>();
foreach (Type type in allTypes)
{
if (type.Namespace == NameSpace)
if (type.Name.Substring(0, 1) == "_")
availableVersion.Add(type.Name);
}
availableVersion.Sort();
updateVersion = new List<string>();
foreach (string s in availableVersion)
{
int version = 0;
if (int.TryParse(s.Substring(1,3), out version))
{
if (version > currentVersion)
{
updateVersion.Add(s);
}
latestVersion = version;
}
}
IsAppVersionOlder = (latestVersion < currentVersion);
//log.WriteLine(string.Format(
///"CheckForMigration: DbVer = {0}, AppVer = {1}, UpdateAvailable = {2}, IsAppOlder = {3}",
//currentVersion, latestVersion, updateVersion.Count, IsAppVersionOlder));
Checked = true;
}
internal static void Migrate()
{
foreach (string s in updateVersion)
{
Migration _migration = (Migration)Activator.CreateInstance(
System.Reflection.Assembly.GetExecutingAssembly().GetType(
"MyApps.Migrations." + s));
_migration.Migrate("YourProviderName", Migration.MigrationDirection.Up);
IncrementVersion();
}
}
private static void IncrementVersion()
{
new Update(SCHEMA_INFO,
"YourProviderName").SetExpression("version").EqualTo("version+1").Execute();
}
}
}
Таблица с именем SubSonicSchemaInfo будет автоматически добавлена SubSonic в вашу базу данных, чтобы помочь отслеживать версию базы данных.
Это длинный пост, надеюсь, я ничего не пропустил