2009-10-25 8 views
2

Je joue avec SimpleRepository de SubSonic, et c'est génial. Cependant, j'aimerais savoir s'il existe un moyen facile d'appliquer les modifications en attente à un système de production.Comment appliquer les modifications "SimpleRepository" de SubSonic 3 aux systèmes de production

Auparavant, j'ai utilisé les "Migrations" de SubSonic 2 via un fichier batch; Quand j'étais prêt à passer à la production, je courais juste toutes les migrations en attente contre le serveur de production, et je serais prêt à partir. Nice et simple. La fonction SimpleRepostitory adopte une approche plus «run it when you» pour les migrations, mais je ne veux pas laisser cette option activée en production.

Existe-t-il un moyen d'obtenir une liste des modifications en attente? Je sais que je pourrais utiliser quelque chose comme SqlDiff, mais puisque j'avais une solution de travail avant, il serait dommage de le perdre ...

Quelqu'un?

Répondre

0

Si vous utilisez reflector, vous pouvez facilement trouver comment SimpleRepository gère les migrations.

Je n'ai pas vraiment essayé ce code, mais vous pouvez tout simplement faire les même migrations le SimpleRepository fait:

  • Créer une nouvelle Migrator, en passant dans votre Assemblée au constructeur.
  • Créer un BatchQuery si vous souhaitez utiliser les transactions
  • Itérer à travers les types que vous voulez migrer, obtenir la chaîne SQL en appelant la méthode MigrateFromModel sur l'objet Migrator
  • si vous souhaitez utiliser le BatchQuery, créez un new QueryCommand et passez l'objet à la méthode QueueForTransaction de BatchQuery.

Voici la méthode réflecteur: (suivant la logique sur la façon dont MigrateFromModel chiffres sur ce qui doit changer est laissé comme un exercice pour le lecteur :))

private void Migrate<T>() where T: class, new() 
{ 
    Type item = typeof(T); 
    if (!this.migrated.Contains(item)) 
    { 
     BatchQuery query = new BatchQuery(this._provider); 
     Migrator migrator = new Migrator(Assembly.GetExecutingAssembly()); 
     foreach (string str in migrator.MigrateFromModel(item, this._provider)) 
     { 
      query.QueueForTransaction(new QueryCommand(str, this._provider)); 
     } 
     query.ExecuteTransaction(); 
     this.migrated.Add(item); 
    } 
} 
+0

Doux, je vais essayer ... – jvenema

+0

Je ne vais pas avoir l'occasion de tester ça avant que la prime n'expire, donc je te la donne quand même. Merci pour la réponse. – jvenema

+0

Merci :) - laissez-moi savoir comment cela fonctionne. –

0

Toute chance que vous pouvez emballer cette et le partager avec le projet? :)

J'ai utilisé une solution de migration beaucoup plus pauvre, mais elle n'a pas de fonction de restauration ou autre.

+0

Les trucs de Migrator fonctionneront avec n'importe quel assemblage/frappe que vous lui passerez - J'ai besoin d'écrire un post sur ce blog ... –

Questions connexes