using System; using System.Linq; using Microsoft.EntityFrameworkCore; using InternshipSystem.Core; using InternshipSystem.Core.Entity; using InternshipSystem.Core.Entity.Internship; using InternshipSystem.Core.UglyOrmArtifacts; namespace InternshipSystem.Repository { public class InternshipDbContext : DbContext { public DbSet Companies { get; set; } public DbSet Editions { get; set; } public DbSet StaticPages { get; set; } public DbSet InternshipTypes { get; set; } public DbSet Students { get; set; } public DbSet Courses { get; set; } public DbSet Internships { get; set; } public DbSet ReportFields { get; set; } public InternshipDbContext(DbContextOptions options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder .UseSnakeCaseNamingConvention(); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .OwnsOne(bo => bo.Address); modelBuilder.Entity() .OwnsOne(ir => ir.Mentor); modelBuilder.Entity(builder => { builder .HasKey(scan => scan.DocumentId); builder .HasOne(s => s.Document) .WithOne(d => d.Scan); }); modelBuilder.Entity(builder => { builder .HasKey(subject => new { InternshipProgramId = subject.InternshipRegistrationId, subject.InternshipSubjectId }); builder .HasOne(k => k.Registration) .WithMany(model => model.Subjects) .HasForeignKey(subject => subject.InternshipRegistrationId); builder .HasOne(k => k.Subject) .WithMany() .HasForeignKey(subject => subject.InternshipSubjectId); }); modelBuilder.Entity(builder => { builder .HasKey(type => new { type.EditionId, type.InternshipTypeId}); builder .HasOne(k => k.Edition) .WithMany(model => model.AvailableInternshipTypes) .HasForeignKey(p => p.EditionId); builder .HasOne(k => k.InternshipType) .WithMany() .HasForeignKey(type => type.InternshipTypeId); }); modelBuilder.Entity(builder => { builder .HasKey(subject => new { subject.EditionId, subject.InternshipSubjectId}); builder .HasOne(k => k.Edition) .WithMany(model => model.AvailableSubjects) .HasForeignKey(p => p.EditionId); builder .HasOne(k => k.Subject) .WithMany() .HasForeignKey(subject => subject.InternshipSubjectId); }); modelBuilder.Entity(builder => { builder .HasKey(e => new {e.EditionId, e.ReportFieldId}); builder .HasOne(e => e.Edition) .WithMany(edition => edition.ReportSchema) .HasForeignKey(r => r.EditionId); builder .HasOne(e => e.Field) .WithMany() .HasForeignKey(r => r.ReportFieldId); }); modelBuilder.Entity() .HasDiscriminator("field_discrimnator") .HasValue("single") .HasValue("choice"); modelBuilder.Entity() .Property(r => r.Choices) .HasConversion( a => string.Join('#', a), s => s.Split('#', StringSplitOptions.RemoveEmptyEntries)); modelBuilder.Entity() .Property(r => r.Value) .HasColumnType("jsonb"); } } }