using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations; using SpaceRace.Shared; namespace Server; public class SpaceRaceDbContext : DbContext { public DbSet Laps { get; set; } public DbSet PbDTO { get; set; } public SpaceRaceDbContext(DbContextOptions options) : base(options) {} protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); new SpaceRaceInitialiser(modelBuilder).Seed(); modelBuilder.Entity(pb => { var pbQuery = $$""" WITH ranked AS ( SELECT *, rank() OVER (ORDER BY "Time" ASC) AS "Position", COUNT("Id") OVER () AS "Completions" FROM "Laps" ) SELECT * FROM ranked """; pb.HasNoKey(); pb.ToSqlQuery(pbQuery); }); } } [Index(nameof(UserId), nameof(Map), IsUnique = true)] [Index(nameof(Map))] public class Lap { public DateTimeOffset Created { get; set; } public Guid Id { get; set; } public Guid UserId { get; set; } public double Time { get; set; } [Required] public string Map { get; set; } } class SpaceRaceInitialiser { private readonly ModelBuilder modelBuilder; public SpaceRaceInitialiser(ModelBuilder modelBuilder) { this.modelBuilder = modelBuilder; } public void Seed() { modelBuilder.Entity().HasData( new Lap { Created = DateTimeOffset.UtcNow, Id = Guid.NewGuid(), UserId = new Guid("11111111-1111-1111-1111-111111111111"), Time = 128f, Map = "sr_TestTrack", }, new Lap { Created = DateTimeOffset.UtcNow, Id = Guid.NewGuid(), UserId = new Guid("22222222-2222-2222-2222-222222222222"), Time = 132f, Map = "sr_TestTrack", }, new Lap { Created = DateTimeOffset.UtcNow, Id = Guid.NewGuid(), UserId = new Guid("33333333-3333-3333-3333-333333333333"), Time = 148f, Map = "sr_TestTrack", } ); } }