2008-12-16 7 views
3

Existe-t-il des mappeurs O/R qui créeront ou modifieront automatiquement le schéma de base de données lors de la mise à jour des objets métier? Après avoir regardé autour, il semble que la plupart des bibliothèques fonctionnent de l'autre côté en créant un objet métier à partir du schéma de la base de données.Les mappeurs O/R qui peuvent mettre à jour le schéma de base de données automatiquement?

La raison pour laquelle je voudrais avoir cette capacité est que je prévois un produit qui stocke ses données dans une base de données sur la machine du client. Il se peut donc que je doive mettre à jour le schéma de base de données lorsqu'une nouvelle version sortira.

Une autre exigence est que le mappeur prenne en charge une base de données basée sur des fichiers, telle que SQLite ou JET, et pas seulement SQL Server.

Je sais que XPO de Developer Express a cette capacité, mais je me demandais s'il existait des alternatives.

Merci

Répondre

1

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:

  1. 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 
     } 
    } 
} 
  1. 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é

2

NHibernate peut générer le schéma de base de données des objets métier pour vous.

0

NHibernate peut-il mettre à jour le schéma ou le supprime-t-il et le recréer?

+1

gouttes et recrée – mikus

Questions connexes