using Microsoft.EntityFrameworkCore; namespace Harmonia.Core.Library; public class AudioLibraryContext(DbContextOptions options) : DbContext(options) { public DbSet Locations { get; set; } public DbSet Folders { get; set; } public DbSet Songs { get; set; } public DbSet SongTags { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); ConfigureLocation(modelBuilder); ConfigureFolder(modelBuilder); ConfigureSong(modelBuilder); ConfigureSongTag(modelBuilder); } private static void ConfigureLocation(ModelBuilder modelBuilder) { modelBuilder .Entity() .HasKey(x => x.LocationId); modelBuilder .Entity() .HasMany(x => x.Folders) .WithOne(x => x.Location) .OnDelete(DeleteBehavior.ClientCascade); } private static void ConfigureFolder(ModelBuilder modelBuilder) { modelBuilder .Entity() .HasKey(x => x.FolderId); modelBuilder .Entity() //.HasIndex(x => new { x.LocationId, x.Name }) .HasIndex(x => new { x.Name }) .IsUnique(true); modelBuilder .Entity() .HasMany(x => x.Songs) .WithOne(x => x.Folder) .OnDelete(DeleteBehavior.ClientCascade); } private static void ConfigureSong(ModelBuilder modelBuilder) { modelBuilder .Entity() .HasKey(x => x.SongId); modelBuilder .Entity() .HasIndex(x => new { x.FolderId, x.FileName }) .IsUnique(true); modelBuilder.Entity() .HasOne(x => x.SongTag) .WithOne(x => x.Song) .OnDelete(DeleteBehavior.ClientCascade); } private static void ConfigureSongTag(ModelBuilder modelBuilder) { modelBuilder .Entity() .HasKey(x => x.SongTagId); modelBuilder .Entity() .HasIndex(x => x.SongId) .IsUnique(true); modelBuilder .Entity() .HasIndex(x => x.Album); modelBuilder .Entity() .HasIndex(x => x.Title); modelBuilder .Entity() .HasIndex(x => x.Artist); modelBuilder .Entity() .HasIndex(x => x.AlbumArtist); modelBuilder .Entity() .HasIndex(x => x.DiscNumber); modelBuilder .Entity() .HasIndex(x => x.TrackNumber); modelBuilder .Entity() .HasIndex(x => x.Genre); modelBuilder .Entity() .HasIndex(x => x.ReleaseDate); } }