// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
//                         marc.chevaldonne.free.fr
//
// Module        : Program.cs
// Author        : Marc Chevaldonné
// Creation date : 2016-10-19
//
// ========================================================================

using System;
using static System.Console;

namespace ex_042_008_EF_CF_One_to_Many
{
    class Program
    {
        /// <summary>
        /// Cet exemple montre comment construire une relation 1-many dans la base de données en utilisant les conventions de nommage Entity Framework.
        /// 
        /// on utilise les données stubbées de DbContextInitializer
        /// On affiche les Albums et les Morceaux.
        /// Constatez que les identifiants sont bien les mêmes à cause de la relation 1-many.
        /// 
        /// Si vous ouvrez la base de données (via l'explorateur d'objets SQL Server), vous pourrez constater que la table Morceaux 
        ///     contient une colonne Album_UniqueId qui permet d'assurer la relation 1-many.
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            OutputEncoding = System.Text.Encoding.UTF8;

            try
            {
                //création du DbContext et injection de la dépendance à MyStubDataInitializationStrategy
                using (AlbumDBEntities db = new AlbumDBEntities())
                {
                    //choix de la stratégie et remplissage avec des données stubbées
                    DbContextInitializer.Seed(db);

                    WriteLine("Albums : ");
                    foreach (var a in db.Albums)
                    {
                        WriteLine($"\t{a.UniqueId}: {a.Titre} (sorti le : {a.DateDeSortie.ToString("d")})");
                        foreach (var m in a.Morceaux)
                        {
                            WriteLine($"\t\t{m.Titre}");
                        }
                    }

                    WriteLine();

                    WriteLine("Morceaux :");
                    foreach (var m in db.Morceaux)
                    {
                        WriteLine($"\t{m.UniqueId}: {m.Titre} (album : {m.Album.Titre})");
                    }

                }
            }
            catch (NotImplementedException exception)
            {
                WriteLine(exception.Message);
            }
            catch (Exception)
            {
                WriteLine("Votre base de données n'existe pas. C'est peut-être la première fois que vous exécutez cet exemple.");
                WriteLine("Pour créer la base de données, suivez les instructions suivantes (que vous retrouvez en commentaires dans la classe Program) :");
                WriteLine("Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien,");
                WriteLine("- dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package),");
                WriteLine("- dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_008_EF_CF_One_to_Many)");
                WriteLine("- tapez : dotnet restore (pour restaurer les packages .NET Core)");
                WriteLine("- tapez : dotnet ef migrations add MyFirstMigration");
                WriteLine("    note : vous pourrez détruire le dossier Migrations une fois la base créée");
                WriteLine("- tapez : dotnet ef database update");
                WriteLine("    Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO.");
                WriteLine("\nDans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf");
            }

            ReadLine();
        }
    }
}
