using ErsatzTV.Core.Domain; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace ErsatzTV.Infrastructure.Data.Configurations; public class MultiCollectionConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.ToTable("MultiCollection"); builder.Property(mc => mc.Version).IsConcurrencyToken(); builder.Property(mc => mc.Name) .HasMaxLength(50) .HasColumnType("varchar(50)"); builder.HasIndex(mc => mc.Name) .IsUnique(); // Cleanup + list-hiding of the system multi collection an auto-tune weighted channel owns (#425). // Nullable: null = a normal user multi collection. builder.HasIndex(mc => mc.OwnedByChannelId); builder.HasMany(m => m.Collections) .WithMany(m => m.MultiCollections) .UsingEntity( j => j.HasOne(mci => mci.Collection) .WithMany(c => c.MultiCollectionItems) .HasForeignKey(mci => mci.CollectionId) .OnDelete(DeleteBehavior.Cascade), j => j.HasOne(mci => mci.MultiCollection) .WithMany(mc => mc.MultiCollectionItems) .HasForeignKey(mci => mci.MultiCollectionId) .OnDelete(DeleteBehavior.Cascade), j => { j.HasKey(mci => new { mci.MultiCollectionId, mci.CollectionId }); // default 1 = fair share (#70). Must be a DB default too, or existing rows migrate to 0 -- // a value that means nothing on a share-of-airtime scale. The enumerator clamps such a // row to the floor, so it rotates rather than vanishing; the backfill should still be // right at the source. j.Property(mci => mci.Weight).HasDefaultValue(1); }); builder.HasMany(m => m.SmartCollections) .WithMany(m => m.MultiCollections) .UsingEntity( j => j.HasOne(mci => mci.SmartCollection) .WithMany(c => c.MultiCollectionSmartItems) .HasForeignKey(mci => mci.SmartCollectionId) .OnDelete(DeleteBehavior.Cascade), j => j.HasOne(mci => mci.MultiCollection) .WithMany(mc => mc.MultiCollectionSmartItems) .HasForeignKey(mci => mci.MultiCollectionId) .OnDelete(DeleteBehavior.Cascade), j => { j.HasKey(mci => new { mci.MultiCollectionId, mci.SmartCollectionId }); // mirrors MultiCollectionItem above -- omitting it would silently un-weight // every smart-collection member of a multi collection j.Property(mci => mci.Weight).HasDefaultValue(1); }); } }