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

using System;
using static System.Console;
using System.Linq;

namespace ex_042_002_EF_CodeFirst_data_annotations
{
    /// <summary>
    /// Ce deuxième exemple utilisant l'approche CodeFirst avec EntityFramework montre comment vous pouvez créer simplement
    /// une base à partir de vos classes métier, en profitant des data annotations d'Entity Framework.
    /// 
    /// Seule la classe Nounours est différente. Tout le reste de l'exemple est le même que le précédent.
    /// 
    /// Contrairement à EntityFramework 6 dans le .NET framework 4.6, il y a un "petit peu" plus de travail à fournir, mais pas des masses... :)
    /// Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien, 
    /// - dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package),
    /// - dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_001_EF_CodeFirst_conventions)
    /// - tapez : dotnet restore (pour restaurer les packages .NET Core)
    /// - tapez : dotnet ef migrations add MyFirstMigration
    ///     note : vous pourrez détruire le dossier Migrations une fois la base créée
    /// - tapez : dotnet ef database update
    ///     Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO.
    ///     Dans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf
    /// 
    /// 
    /// Nous allons nous attarder sur la classe Nounours et NounoursDBEntities.
    /// 1/ Nounours -> voir commentaires dans la classe Nounours 
    /// 2/ NounoursDBEntities -> voir commentaires dans la classe NounoursDBEntities
    /// 
    /// Ensuite, nous pouvons donc instancier NounoursDBEntities (à l'aide d'un bloc using car il s'agit d'une ressource non managée).
    /// Celle-ci donne accès à la DbSet<Nounours> à laquelle nous rajoutons 3 Nounours.
    /// 
    /// Ces modifications sont persistées dans la base lors de l'appel à SaveChanges.
    /// 
    /// Pour visualiser les résultats, vous pouvez :
    /// - aller dans Affichage -> Explorateur d'objets SQL Server
    /// - dans cet explorateur, SQL Server -> (localdb)\MSSQLLocalDB... -> Bases de données 
    ///     -> ex_042_002_EF_CodeFirst_data_annotations -> Tables -> dbo.TableNounours
    ///     en cliquant sur dbo.TableNounours vous pourrez voir la table
    ///     avec un clic droit -> "Afficher les données" sur dbo.Nounours vous pourrez voir les données dans la table
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            OutputEncoding = System.Text.Encoding.UTF8;

            Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 };
            Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 };
            Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 };
            Nounours trixi = new Nounours { Nom = "Trixi", DateDeNaissance = new DateTime(2015, 8, 15), NbPoils = 0 };
            Nounours Roudoudou = new Nounours { Nom = "Roudoudou", DateDeNaissance = new DateTime(2015, 8, 14), NbPoils = 2000 };

            try
            {
                using (NounoursDBEntities db = new NounoursDBEntities())
                {
                    if (db.NounoursSet.Count() > 0)
                    {
                        WriteLine("La base n'est pas vide !");
                        foreach (var n in db.NounoursSet)
                        {
                            WriteLine($"\t{n}");
                        }
                        WriteLine("début du nettoyage...");
                    }
                    foreach (var n in db.NounoursSet.ToArray())
                    {
                        WriteLine($"Suppression de {n}");
                        db.NounoursSet.Remove(n);
                    }

                    WriteLine("Base avant sauvegarde des changements :");
                    foreach (var n in db.NounoursSet)
                    {
                        WriteLine($"\t{n}");
                    }
                    db.SaveChanges();
                    WriteLine("Base après sauvegarde des changements :");
                    foreach (var n in db.NounoursSet)
                    {
                        WriteLine($"\t{n}");
                    }

                    db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok, trixi, Roudoudou });

                    db.SaveChanges();
                    WriteLine("Base après ajout des 3 nounours et sauvegarde des changements :");
                    foreach (var n in db.NounoursSet)
                    {
                        WriteLine($"\t{n}");
                    }

                }
            }
            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_002_EF_CodeFirst_data_annotations)");
                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();
        }
    }
}
