using CvSearch.Data.Entities; using Microsoft.EntityFrameworkCore; namespace CvSearch.Data; public sealed class CvSearchDbContext : DbContext { public const string SchemaName = MigrationConstants.SchemaName; public const string MigrationTableName = MigrationConstants.MigrationTableName; public CvSearchDbContext(DbContextOptions options) : base(options) { } public DbSet JobSearchTokens => Set(); public DbSet JobSearchSessions => Set(); public DbSet JobSearchResults => Set(); public DbSet JobProviders => Set(); protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); // Configure migration history table to use schema-qualified name: [cvSearch].[_Migrations] optionsBuilder.UseSqlServer(x => x.MigrationsHistoryTable(MigrationTableName, SchemaName)); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema(SchemaName); modelBuilder.Entity(entity => { entity.ToTable("JobSearchTokens"); entity.HasKey(x => x.Id); entity.Property(x => x.Id).HasMaxLength(64); entity.Property(x => x.CvDocumentId).HasMaxLength(64).IsRequired(); entity.Property(x => x.Email).HasMaxLength(256).IsRequired(); entity.Property(x => x.Language).HasMaxLength(8).HasDefaultValue("en").IsRequired(); entity.Property(x => x.Used).HasDefaultValue(false); entity.Property(x => x.CreatedAt).HasDefaultValueSql("SYSUTCDATETIME()"); }); modelBuilder.Entity(entity => { entity.ToTable("JobSearchSessions"); entity.HasKey(x => x.Id); entity.Property(x => x.Id).HasMaxLength(64); entity.Property(x => x.TokenId).HasMaxLength(64).IsRequired(); entity.Property(x => x.CvDocumentId).HasMaxLength(64).IsRequired(); entity.Property(x => x.Email).HasMaxLength(256).IsRequired(); entity.Property(x => x.Status).HasMaxLength(32).IsRequired(); entity.Property(x => x.Keywords).HasMaxLength(1000); entity.Property(x => x.ProviderConfigJson).IsRequired(false); entity.Property(x => x.Language).HasMaxLength(8).HasDefaultValue("en").IsRequired(); entity.Property(x => x.CreatedAt).HasDefaultValueSql("SYSUTCDATETIME()"); entity.HasIndex(x => x.Status); }); modelBuilder.Entity(entity => { entity.ToTable("JobSearchResults"); entity.HasKey(x => x.Id); entity.Property(x => x.Id).HasMaxLength(64); entity.Property(x => x.SessionId).HasMaxLength(64).IsRequired(); entity.Property(x => x.ProviderName).HasMaxLength(128); entity.Property(x => x.JobUrl).HasMaxLength(2048); entity.Property(x => x.JobTitle).HasMaxLength(512); entity.Property(x => x.CreatedAt).HasDefaultValueSql("SYSUTCDATETIME()"); entity.HasIndex(x => x.SessionId); }); modelBuilder.Entity(entity => { entity.ToTable("JobProviders"); entity.HasKey(x => x.Id); entity.Property(x => x.Id).UseIdentityColumn(); entity.Property(x => x.Name).HasMaxLength(128).IsRequired(); entity.Property(x => x.SearchUrlTemplate).HasMaxLength(1024).IsRequired(); entity.Property(x => x.JobLinkContains).HasMaxLength(256).IsRequired(); entity.Property(x => x.InitialKeywordsJson).HasMaxLength(2000).HasDefaultValue("[]").IsRequired(); entity.Property(x => x.MaxResults).HasDefaultValue(20); entity.Property(x => x.DisplayOrder).HasDefaultValue(0); }); } }