2010-10-28 8 views
1

J'ai un fichier DBML dans mon projet avec tous mes objets LinqToSql. Au départ, je les ai importés de la DB, et tout allait bien. Maintenant que ma base de données a grandi, j'ai ajouté les nouvelles tables au diagramme dans le concepteur O/R, mais elles sont toujours ajoutées à la fin du XML. C'est un peu pénible, car lorsque je définis des clés étrangères, il répertorie toujours les tables disponibles dans l'ordre dans lequel elles apparaissent dans le fichier XML.Comment trier les objets DBML par ordre alphabétique?

Des idées pour trier les déclarations de la table XML par ordre alphabétique selon le nom de la table?

Répondre

1

Je sais que c'est vieux, mais je veux aussi trier les tables et les fonctions dans mon DBML pour le rendre plus gérable dans Git. Le code d'application de console suivant semble fonctionner plutôt bien. Vous pouvez glisser et déposer un fichier DBML sur l'exe, ou vous pouvez configurer un fichier bat ou construire un événement dans votre projet (s).

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 

namespace DbmlSorter 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args.Length == 0) 
       return; 

      var fileName = args[0]; 

      try 
      { 
       if (!File.Exists(fileName)) 
        return; 

       SortElements(fileName); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
      } 

      Console.WriteLine(); 
      Console.WriteLine("Press any key to exit..."); 
      Console.ReadKey(); 
     } 

     private static void SortElements(string fileName) 
     { 
      var root  = XElement.Load(fileName); 

      var connections = new SortedDictionary<string, XElement>(); 
      var tables  = new SortedDictionary<string, XElement>(); 
      var functions = new SortedDictionary<string, XElement>(); 
      var others  = new SortedDictionary<string, XElement>(); 

      foreach (var element in root.Elements()) 
      { 
       var key = element.ToString(); 

       if (key.StartsWith("<Connection")) 
        connections.Add(key, element); 

       else if (key.StartsWith("<Table")) 
        tables.Add(key, element); 

       else if (key.StartsWith("<Function")) 
        functions.Add(key, element); 

       else 
        others.Add(key, element); 
      } 

      root.RemoveNodes(); 

      foreach (var pair in connections) 
      { 
       root.Add(pair.Value); 

       Console.WriteLine(pair.Key); 
      } 

      foreach (var pair in tables) 
      { 
       root.Add(pair.Value); 

       Console.WriteLine(pair.Key); 
      } 

      foreach (var pair in functions) 
      { 
       root.Add(pair.Value); 

       Console.WriteLine(pair.Key); 
      } 

      foreach (var pair in others) 
      { 
       root.Add(pair.Value); 

       Console.WriteLine(pair.Key); 
      } 

      root.Save(fileName); 
     } 
    } 
} 
1

Une solution possible est d'écrire une petite application qui lit dans le XML, le trie à votre goût et sort la version mise à jour.

+0

OK, c'est la solution laborieuse, et il est techniquement correct, mais j'espérais une façon paresseuse ... :) –

+0

Probablement pas. Ma première option était de créer manuellement le fichier, mais je pensais que vous n'alliez pas aimer ça :). –

+0

Comme ceci https://github.com/timabell/ef-edmx-sorter –

Questions connexes