/// <summary>
 /// Supprime le fichier s'il existe déja.
 /// </summary>
 /// <param name="outputFileName">Nom du fichier.</param>
 private static void DeleteFileIfExists(string outputFileName)
 {
     if (File.Exists(outputFileName))
     {
         TfsManager.CheckOut(outputFileName);
         try {
             File.Delete(outputFileName);
         } catch (IOException e) {
             Console.Error.WriteLine("Le fichier " + outputFileName + " existe déja, erreur lors de la suppression : " + e.Message);
             Environment.Exit(-1);
         }
     }
 }
        /// <summary>
        /// Génère le script SQL.
        /// </summary>
        /// <param name="modelRootList">Liste des tous les modeles OOM analysés.</param>
        /// <param name="outputFileNameCrebas">Nom du fichier de creation des tables en sortie.</param>
        /// <param name="outputFileNameUK">Nom du fichier de creation des clefs uniques.</param>
        /// <param name="outputFileNameIndex">Nom du fichier de création des index et fk en sortie.</param>/// <param name="outputFileNameType">Nom du ficheir de création des types.</param>
        public void GenerateSchemaScript(ICollection <ModelRoot> modelRootList, string outputFileNameCrebas, string outputFileNameUK, string outputFileNameIndex, string outputFileNameType)
        {
            if (modelRootList == null)
            {
                throw new ArgumentNullException("modelRootList");
            }

            Console.Out.WriteLine("Generating schema script");
            DeleteFileIfExists(outputFileNameCrebas);
            DeleteFileIfExists(outputFileNameIndex);
            DeleteFileIfExists(outputFileNameType);

            List <List <ModelProperty> > fkList = new List <List <ModelProperty> >();

            TfsManager.CheckOut(outputFileNameCrebas);
            TfsManager.CheckOut(outputFileNameUK);

            using (StreamWriter writerCrebas = File.CreateText(outputFileNameCrebas),
                   writerUk = File.CreateText(outputFileNameUK),
                   writerType = File.CreateText(outputFileNameType)) {
                writerCrebas.WriteLine("-- =========================================================================================== ");
                writerCrebas.WriteLine("--   Application Name	:	Kinetix ");
                writerCrebas.WriteLine("--   Script Name		:	"+ outputFileNameCrebas);
                writerCrebas.WriteLine("--   Description		:	Script de création des tables.");
                writerCrebas.WriteLine("-- =========================================================================================== ");

                writerUk.WriteLine("-- =========================================================================================== ");
                writerUk.WriteLine("--   Application Name	:	Kinetix");
                writerUk.WriteLine("--   Script Name		:	"+ outputFileNameUK);
                writerUk.WriteLine("--   Description		:	Script de création des indexs uniques.");
                writerUk.WriteLine("-- =========================================================================================== ");

                writerType.WriteLine("-- =========================================================================================== ");
                writerType.WriteLine("--   Application Name	:	Kinetix ");
                writerType.WriteLine("--   Script Name		:	"+ outputFileNameType);
                writerType.WriteLine("--   Description		:	Script de création des types. ");
                writerType.WriteLine("-- =========================================================================================== ");

                foreach (ModelRoot modelRoot in modelRootList)
                {
                    List <ModelProperty> fkProperties = new List <ModelProperty>();
                    foreach (string nsKey in modelRoot.Namespaces.Keys)
                    {
                        foreach (ModelClass classe in modelRoot.Namespaces[nsKey].ClassList)
                        {
                            if (classe.DataContract.IsPersistent)
                            {
                                fkProperties.AddRange(WriteTableDeclaration(classe, writerCrebas, writerUk, writerType));
                            }
                        }
                    }

                    fkList.Add(fkProperties);
                }
            }

            using (StreamWriter writer = File.CreateText(outputFileNameIndex)) {
                writer.WriteLine("-- =========================================================================================== ");
                writer.WriteLine("--   Application Name	:	Kinetix ");
                writer.WriteLine("--   Script Name		:	"+ outputFileNameIndex);
                writer.WriteLine("--   Description		:	Script de création des indexes et des clef étrangères. ");
                writer.WriteLine("-- =========================================================================================== ");
                foreach (List <ModelProperty> fkProperties in fkList)
                {
                    foreach (ModelProperty fkProperty in fkProperties)
                    {
                        GenerateIndexForeignKey(writer, fkProperty);
                        GenerateConstraintForeignKey(fkProperty, writer);
                    }
                }
            }
        }