using Microsoft.EntityFrameworkCore;

namespace ex_042_016_OneToMany_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 DbSet<Album> Albums { get; set; }
        public DbSet<Morceau> Morceaux { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite($"Data Source=ex_042_016_OneToMany_FluentAPI.Albums.db");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //création de la table Album
            modelBuilder.Entity<Album>().HasKey(a => a.AlbumId); //définition de la clé primaire
            modelBuilder.Entity<Album>().Property(a => a.AlbumId)
                                           .ValueGeneratedOnAdd(); //définition du mode de génération de la clé : génération à l'insertion

            //création de la table Morceau
            modelBuilder.Entity<Morceau>().HasKey(m => m.MorceauId); //définition de la clé primaire
            modelBuilder.Entity<Morceau>().Property(m => m.MorceauId)
                                           .ValueGeneratedOnAdd(); //définition du mode de génération de la clé : génération à l'insertion

            // Add the shadow property to the model
            modelBuilder.Entity<Morceau>()
                .Property<int>("AlbumForeignKey");

            // Use the shadow property as a foreign key
            modelBuilder.Entity<Morceau>()
                .HasOne(m => m.Album)
                .WithMany(a => a.Morceaux)
                .HasForeignKey("AlbumForeignKey");

            base.OnModelCreating(modelBuilder);
        }
    }
}
