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


using Microsoft.EntityFrameworkCore;
using System;

namespace ex_042_009_EF_CF_One_to_Many_FluentAPI
{
    /// <summary>
    /// La classe qui dérive de DbContext est celle qui permettra de faire les opérations CRUD sur le modèle.
    /// Cette classe contient deux DbSet<T> pour permettre de réaliser des opérations CRUD sur les types T, ici Album et Morceau.
    /// </summary>
    public class AlbumDBEntities : DbContext
    {
        public virtual DbSet<Album> Albums { get; set; }
        public virtual DbSet<Morceau> Morceaux { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_009_EF_CF_One_to_Many_FluentAPI.Albums.mdf;Trusted_Connection=True;");
        }

        /// <summary>
        /// méthode appelée lors de la création du modèle. 
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //création de la table TableNounours
            modelBuilder.Entity<Album>().ToTable("Albums"); //nom de la table
            modelBuilder.Entity<Album>().HasKey(a => a.UniqueId); //définition de la clé primaire
            modelBuilder.Entity<Album>().Property(a => a.UniqueId)
                                           .ValueGeneratedOnAdd(); //définition du mode de génération de la clé : génération à l'insertion

            //création de la table "Carnets"
            modelBuilder.Entity<Morceau>().ToTable("Morceaux"); // nom de la table
            modelBuilder.Entity<Morceau>().HasKey(m => m.UniqueId); //définition de la clé primaire
            modelBuilder.Entity<Morceau>().Property(m => m.UniqueId)
                                                .ValueGeneratedOnAdd(); // définition du mode de génération de la clé : pas de génération automatique


            //on crée une propriété fantôme (shadow property) pour l'entity Morceau qu'on utilisera comme clé étrangère (foreign key)
            // En effet, j'ai pris le cas où nous décidons d'utiliser une classe existante pour laquelle aucune clé étrangère n'a été prévue.
            // Il me semblait donc logique qu'on cherche à l'utiliser sans qu'elle soit dans le modèle
            modelBuilder.Entity<Morceau>().Property<Guid>("MorceauId");

            //on précise qu'il y a une relation entre Album et Morceau
            modelBuilder.Entity<Album>().HasMany(a => a.Morceaux) // on dit que l'Album a plusieurs morceaux
                                        .WithOne(m => m.Album) // et que chaque morceau a un album
                                        .HasForeignKey("MorceauId"); //on utilise la clé étrangère fantôme créée précédemment
            //Si vous regardez la table obtenue, vous pouvez voir qu'Entity Framework a automatiquement généré une clé étrangère.


            base.OnModelCreating(modelBuilder);
        }
    }
}
