using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; public class EncounterConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.ToTable("encounters", t => { t.HasCheckConstraint("chk_encounters_encounter_type", "encounter_type IN ('INPATIENT', 'OUTPATIENT', 'EMERGENCY')"); t.HasCheckConstraint("chk_encounters_status", "status IN ('SCHEDULED', 'ACTIVE', 'DISCHARGED', 'CANCELLED')"); }); builder.HasKey(e => e.Id); builder.Property(e => e.Id).HasColumnName("id").HasDefaultValueSql("gen_random_uuid()"); builder.Property(e => e.PatientId).HasColumnName("patient_id"); builder.Property(e => e.EncounterType) .HasColumnName("encounter_type") .HasMaxLength(20) .HasConversion( v => v.ToDbString(), v => EncounterTypeExtensions.FromDbString(v)) .IsRequired(); builder.Property(e => e.Status) .HasColumnName("status") .HasMaxLength(20) .HasConversion( v => v.ToDbString(), v => EncounterStatusExtensions.FromDbString(v)) .HasDefaultValueSql("'SCHEDULED'") .HasSentinel((EncounterStatus)(-1)); builder.Property(e => e.Department).HasColumnName("department").HasMaxLength(100).IsRequired(); builder.Property(e => e.AttendingPhysician).HasColumnName("attending_physician").HasMaxLength(200).IsRequired(); builder.Property(e => e.AdmittedAt).HasColumnName("admitted_at").HasDefaultValueSql("NOW()"); builder.Property(e => e.DischargedAt).HasColumnName("discharged_at"); builder.Property(e => e.CreatedAt).HasColumnName("created_at").HasDefaultValueSql("NOW()"); builder.HasOne(e => e.Patient) .WithMany(p => p.Encounters) .HasForeignKey(e => e.PatientId) .OnDelete(DeleteBehavior.Restrict); builder.HasIndex(e => new { e.PatientId, e.AdmittedAt }); builder.HasIndex(e => new { e.Status, e.AdmittedAt }) .HasFilter("status = 'ACTIVE'"); } }