using API.Schema.MangaContext.MangaConnectors; using API.Schema.MangaContext.MetadataFetchers; using Microsoft.EntityFrameworkCore; namespace API.Schema.MangaContext; public class MangaContext(DbContextOptions options) : TrangaBaseContext(options) { public DbSet MangaConnectors { get; set; } public DbSet Mangas { get; set; } public DbSet LocalLibraries { get; set; } public DbSet Chapters { get; set; } public DbSet Authors { get; set; } public DbSet Tags { get; set; } public DbSet> MangaConnectorToManga { get; set; } public DbSet> MangaConnectorToChapter { get; set; } public DbSet MetadataEntries { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { //MangaConnector Types modelBuilder.Entity() .HasDiscriminator(c => c.Name) .HasValue("Global") .HasValue("MangaDex") .HasValue("ComickIo"); //Manga has many Chapters modelBuilder.Entity() .HasMany(m => m.Chapters) .WithOne(c => c.ParentManga) .HasForeignKey(c => c.ParentMangaId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .Navigation(m => m.Chapters) .EnableLazyLoading(); modelBuilder.Entity() .Navigation(c => c.ParentManga) .EnableLazyLoading(); //Chapter has MangaConnectorIds modelBuilder.Entity() .HasMany>(c => c.MangaConnectorIds) .WithOne(id => id.Obj) .HasForeignKey(id => id.ObjId) .OnDelete(DeleteBehavior.NoAction); modelBuilder.Entity>() .HasOne(id => id.MangaConnector) .WithMany() .HasForeignKey(id => id.MangaConnectorName) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity>() .Navigation(entry => entry.MangaConnector) .EnableLazyLoading(); //Manga owns MangaAltTitles modelBuilder.Entity() .OwnsMany(m => m.AltTitles) .WithOwner(); modelBuilder.Entity() .Navigation(m => m.AltTitles) .AutoInclude(); //Manga owns Links modelBuilder.Entity() .OwnsMany(m => m.Links) .WithOwner(); modelBuilder.Entity() .Navigation(m => m.Links) .AutoInclude(); //Manga has many Tags associated with many Obj modelBuilder.Entity() .HasMany(m => m.MangaTags) .WithMany() .UsingEntity("MangaTagToManga", l=> l.HasOne(typeof(MangaTag)).WithMany().HasForeignKey("MangaTagIds").HasPrincipalKey(nameof(MangaTag.Tag)), r => r.HasOne(typeof(Manga)).WithMany().HasForeignKey("MangaIds").HasPrincipalKey(nameof(Manga.Key)), j => j.HasKey("MangaTagIds", "MangaIds") ); modelBuilder.Entity() .Navigation(m => m.MangaTags) .AutoInclude(); //Manga has many Authors associated with many Obj modelBuilder.Entity() .HasMany(m => m.Authors) .WithMany() .UsingEntity("AuthorToManga", l=> l.HasOne(typeof(Author)).WithMany().HasForeignKey("AuthorIds").HasPrincipalKey(nameof(Author.Key)), r => r.HasOne(typeof(Manga)).WithMany().HasForeignKey("MangaIds").HasPrincipalKey(nameof(Manga.Key)), j => j.HasKey("AuthorIds", "MangaIds") ); modelBuilder.Entity() .Navigation(m => m.Authors) .AutoInclude(); //Manga has many MangaIds modelBuilder.Entity() .HasMany>(m => m.MangaConnectorIds) .WithOne(id => id.Obj) .HasForeignKey(id => id.ObjId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .Navigation(m => m.MangaConnectorIds) .EnableLazyLoading(); modelBuilder.Entity>() .HasOne(id => id.MangaConnector) .WithMany() .HasForeignKey(id => id.MangaConnectorName) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity>() .Navigation(entry => entry.MangaConnector) .EnableLazyLoading(); //FileLibrary has many Mangas modelBuilder.Entity() .HasMany() .WithOne(m => m.Library) .HasForeignKey(m => m.LibraryId) .OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity() .Navigation(m => m.Library) .EnableLazyLoading(); modelBuilder.Entity() .HasDiscriminator(nameof(MetadataEntry)) .HasValue(nameof(MyAnimeList)); //MetadataEntry modelBuilder.Entity() .HasOne(entry => entry.Manga) .WithMany() .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasOne(entry => entry.MetadataFetcher) .WithMany() .OnDelete(DeleteBehavior.Cascade); } }