SubSonic fait ce dont vous avez besoin. Il a une classe de migration à utiliser avec le commandant sonic. J'ai modifié le code et l'ai mis au démarrage de mes applications, et je l'ai vérifié pour la différence de version et mettre à jour automatiquement. Voici comment vous devez le configurer:
- Vous devez ajouter la classe de migration versionnée. Vous pouvez jeter un oeil à ce tutorial si vous n'avez jamais utilisé SubSonic auparavant. La classe suivante est enregistrée sous \ Migrations \ 001_initial.cs, si vous avez appelé migrate.exe (à l'intérieur de VS) à partir de subsonic, la base de données actuelle sera mise à jour avec la dernière version disponible. Vous devez conserver le préfixe de version à 3 chiffres comme nom de fichier pour que migrate.exe fonctionne correctement, comme indiqué dans le didacticiel. En ce qui concerne le nom de classe, le préfixe de soulignement et de version à 3 chiffres est nécessaire pour la classe de migration écrite par moi-même pour détecter la version correctement.
// * Je ne sais pas pourquoi je besoin de cette ligne pour rendre le bloc de code de travail ci-dessous
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
}
}
}
- appelé CheckForMigration() lors du démarrage de votre application. IsUpdateAvailable indique que vous devez mettre à jour la base de données. Vous avez juste besoin d'appeler Migrate(). IsAppVersionOlder indique que votre application est faite avec l'ancienne version du schéma db (peut-être qu'une autre copie des nouvelles applications a mis à jour la base de données). Avec, vous pouvez empêcher les anciennes applications de fonctionner et de corrompre votre base de données mise à jour.
//
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();
}
}
}
Une table nommée SubSonicSchemaInfo sera ajoutée automatiquement par subsonique à votre base de données pour aider à garder une trace de la version db.
C'est un long message, j'espère que je n'ai rien manqué
gouttes et recrée – mikus