using Microsoft.EntityFrameworkCore; using Shadow.Entities; using System.Diagnostics.Metrics; using System.Reflection.Emit; namespace Shadow.Data; public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions options) : base(options) { } // EFC ORM Setup public DbSet Albums => Set(); public DbSet AlbumInteractions => Set(); public DbSet Artists => Set(); public DbSet Genres => Set(); public DbSet GenreSongs => Set(); public DbSet Images => Set(); public DbSet Playlists => Set(); public DbSet PlaylistSongs => Set(); public DbSet PlaylistUsers => Set(); public DbSet Radios => Set(); public DbSet Songs => Set(); public DbSet SongInteractions => Set(); public DbSet Users => Set(); protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // Composite keys setup builder.Entity() .HasKey(ai => new { ai.AlbumId, ai.UserId }); builder.Entity() .HasKey(gs => new { gs.GenreId, gs.SongId }); builder.Entity() .HasKey(ps => new { ps.PlaylistId, ps.SongId }); builder.Entity() .HasKey(pu => new { pu.PlaylistId, pu.UserId }); builder.Entity() .HasKey(si => new { si.SongId, si.UserId }); // Constraints (UQ) builder.Entity(a => { a.HasIndex(a => a.Uri).IsUnique(); }); builder.Entity(a => { a.HasIndex(a => a.NormalizedName).IsUnique(); }); builder.Entity(g => { g.HasIndex(g => g.NormalizedName).IsUnique(); }); builder.Entity(p => { p.HasIndex(p => p.Uri).IsUnique(); }); builder.Entity(r => { r.HasIndex(r => r.NormalizedName).IsUnique(); }); builder.Entity(s => { s.HasIndex(s => s.Uri).IsUnique(); }); builder.Entity(u => { u.HasIndex(u => u.Name).IsUnique(); // u.HasIndex(u => u.Email).IsUnique(); }); // Force dependent side on Image builder.Entity() .HasOne(i => i.Song) .WithOne(s => s.Image) .HasForeignKey(i => i.SongId); } }