using Microsoft.EntityFrameworkCore; using Modules.Library.Database.Database.Models; using Modules.Library.Database.Database.Models.Anime; using Modules.Library.Database.Database.Models.CommonProperties; using Modules.Library.Database.Database.Models.Genre; using Modules.Library.Database.Database.Models.Language; namespace Modules.Library.Database.Database; public class LibraryDbContext : DbContext { public DbSet Genres { get; set; } public DbSet Languages { get; set; } public DbSet MediaInfos { get; set; } public DbSet AnimeTitles { get; set; } public DbSet AnimeSeasons { get; set; } public DbSet AnimeEpisodes { get; set; } public LibraryDbContext(DbContextOptions options) : base(options) { } protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Properties().HaveConversion(); } protected override void OnModelCreating(ModelBuilder modelBuilder) { /* ** LANGUAGE ** */ modelBuilder.Entity(q => { q.HasKey(q => q.Id); q.Property(q => q.Name).HasMaxLength(64); q.Property(q => q.CodeIso3).HasMaxLength(3); }); /* ** GENRE ** */ modelBuilder.Entity(q => { q.HasKey(q => q.Id); q.Property(q => q.Name).HasMaxLength(64); }); /* ** ANIME ** */ modelBuilder.Entity(q => { q.HasKey(q => q.Id); q.HasOne(q => q.CommonProperties) .WithOne() .HasForeignKey("AnimeTitleId") .OnDelete(DeleteBehavior.Cascade); q.HasMany(q => q.Items) .WithOne(q => q.Title) .HasForeignKey(q => q.AnimeTitleId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(q => { q.HasKey(q => q.Id); q.HasOne(q => q.CommonProperties) .WithOne() .HasForeignKey("AnimeItemId") .OnDelete(DeleteBehavior.Cascade); q.UseTpcMappingStrategy(); }); modelBuilder.Entity(q => { q.ToTable("Anime_Seasons"); q.Property(q => q.OriginCountry).HasMaxLength(64); q.Property(q => q.Director).HasMaxLength(128); //q.OwnsOne(q => q.CommonProperties); //q.HasMany(q => q.CommonProperties.Names).WithOne(); //q.HasMany(q => q.CommonProperties.Descriptions).WithOne(); //q.HasMany(q => q.CommonProperties.Genres).WithOne(); //q.HasMany(q => q.CommonProperties.RelatedContent).WithOne(); //q.OwnsOne(q => q.CommonProperties.Preview); q.HasMany(q => q.Episodes) .WithOne(q => q.Season) //.HasForeignKey(q => q.SeasonId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(q => { q.ToTable("Anime_Episodes"); }); /* COMMON PROPERTIES */ modelBuilder.Entity(q => { q.HasMany(q => q.Names).WithOne().OnDelete(DeleteBehavior.Cascade); q.HasMany(q => q.Descriptions).WithOne().OnDelete(DeleteBehavior.Cascade); q.HasMany(q => q.Genres).WithOne().OnDelete(DeleteBehavior.Cascade); q.HasMany(q => q.RelatedContent).WithOne().OnDelete(DeleteBehavior.Cascade); q.HasOne(q => q.Preview).WithMany().OnDelete(DeleteBehavior.Cascade); }); } }