using Marathon.Infrastructure.Persistence.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Marathon.Infrastructure.Persistence.Configurations; internal sealed class EventConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.ToTable("Events"); builder.HasKey(e => e.EventCode); builder.Property(e => e.EventCode).HasColumnType("TEXT").IsRequired(); builder.Property(e => e.SportCode).HasColumnType("INTEGER").IsRequired(); builder.Property(e => e.CountryCode).HasColumnType("TEXT").IsRequired(); builder.Property(e => e.LeagueId).HasColumnType("TEXT").IsRequired(); builder.Property(e => e.Category).HasColumnType("TEXT").HasDefaultValue(string.Empty); builder.Property(e => e.ScheduledAt).HasColumnType("TEXT").IsRequired(); builder.Property(e => e.Side1Name).HasColumnType("TEXT").IsRequired(); builder.Property(e => e.Side2Name).HasColumnType("TEXT").IsRequired(); builder.Property(e => e.EventPath).HasColumnType("TEXT"); // Index for date-range queries and sport filtering builder.HasIndex(e => new { e.SportCode, e.ScheduledAt }).HasDatabaseName("IX_Events_SportCode_ScheduledAt"); builder.HasIndex(e => e.ScheduledAt).HasDatabaseName("IX_Events_ScheduledAt"); builder.HasMany(e => e.Snapshots) .WithOne(s => s.Event) .HasForeignKey(s => s.EventCode) .OnDelete(DeleteBehavior.Cascade); builder.HasOne(e => e.Result) .WithOne(r => r.Event) .HasForeignKey(r => r.EventCode) .OnDelete(DeleteBehavior.Cascade); builder.HasMany(e => e.Anomalies) .WithOne(a => a.Event) .HasForeignKey(a => a.EventCode) .OnDelete(DeleteBehavior.Cascade); } }