using Manager.Data.Entities.LibraryContext; using Manager.Data.Entities.LibraryContext.Join; using Microsoft.EntityFrameworkCore; namespace Manager.Data.Contexts; public sealed class LibraryDbContext : DbContext { public LibraryDbContext(DbContextOptions options) : base(options) { ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; ChangeTracker.LazyLoadingEnabled = false; } public DbSet Captions { get; set; } public DbSet Channels { get; set; } public DbSet Accounts { get; set; } public DbSet HttpCookies { get; set; } public DbSet Media { get; set; } public DbSet MediaFormats { get; set; } public DbSet Playlists { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(ce => { ce.ToTable("captions"); ce.HasKey(x => new { x.MediaId, x.LanguageCode }); }); modelBuilder.Entity(channel => { channel.ToTable("channels"); channel.HasKey(x => x.Id); channel.HasMany(x => x.Media) .WithOne() .HasForeignKey(x => x.ChannelId); channel.HasMany(x => x.Playlists) .WithOne() .HasForeignKey(x => x.ChannelId); channel.HasOne(x => x.ClientAccount) .WithOne() .HasForeignKey(e => e.Id); }); modelBuilder.Entity(cae => { cae.ToTable("client_accounts"); cae.HasKey(x => x.Id); cae.HasMany(x => x.HttpCookies) .WithOne() .HasForeignKey(x => x.ClientId); }); modelBuilder.Entity(httpce => { httpce.ToTable("http_cookies"); httpce.HasKey(x => x.Name); }); modelBuilder.Entity(me => { me.ToTable("media"); me.HasKey(x => x.Id); me.HasMany(x => x.Formats) .WithOne() .HasForeignKey(mf => mf.MediaId); me.HasMany(x => x.Captions) .WithOne() .HasForeignKey(ce => ce.MediaId); }); modelBuilder.Entity(mfe => { mfe.ToTable("media_formats"); mfe.HasKey(x => new { x.MediaId, x.Itag }); }); modelBuilder.Entity(ple => { ple.ToTable("playlists"); ple.HasKey(x => x.Id); }); /* Join tables */ modelBuilder.Entity(pmj => { pmj.ToTable("join_playlist_media"); pmj.HasKey(x => new { x.PlaylistId, x.MediaId }); pmj.HasOne() .WithMany(pe => pe.PlaylistMedias) .HasForeignKey(fk => fk.PlaylistId); pmj.HasOne() .WithMany(me => me.PlaylistMedias) .HasForeignKey(fk => fk.MediaId); }); base.OnModelCreating(modelBuilder); } }