using FinlyticFundamentals.Entities; using Microsoft.EntityFrameworkCore; namespace FinlyticFundamentals.Database; public class FundamentalsDbContext : DbContext { public FundamentalsDbContext(DbContextOptions options) : base(options) { } public DbSet AssetFundamentals => Set(); public DbSet CompanyExecutives => Set(); public DbSet FinancialStatements => Set(); public DbSet ForwardEstimates => Set(); public DbSet TickerFundamentals => Set(); public DbSet Settings => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // AssetFundamentals Configurations modelBuilder.Entity(entity => { entity.HasKey(e => e.Isin); entity.HasIndex(e => e.PrimaryTicker).IsUnique(); // Setup One-to-Many Relationships with cascades entity.HasMany(e => e.Executives) .WithOne(e => e.AssetFundamentals) .HasForeignKey(e => e.Isin) .OnDelete(DeleteBehavior.Cascade); entity.HasMany(e => e.FinancialStatements) .WithOne(e => e.AssetFundamentals) .HasForeignKey(e => e.Isin) .OnDelete(DeleteBehavior.Cascade); entity.HasMany(e => e.Estimates) .WithOne(e => e.AssetFundamentals) .HasForeignKey(e => e.Isin) .OnDelete(DeleteBehavior.Cascade); entity.HasMany(e => e.TickerFundamentals) .WithOne(e => e.AssetFundamentals) .HasForeignKey(e => e.Isin) .OnDelete(DeleteBehavior.Cascade); }); // CompanyExecutive Configurations modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.Isin); }); // FinancialStatement Configurations modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.Isin); // Compound Index to prevent duplicate statement entries entity.HasIndex(e => new { e.Isin, e.PeriodType, e.EndDate }).IsUnique(); }); // ForwardEstimate Configurations modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.Isin); entity.HasIndex(e => new { e.Isin, e.Period }).IsUnique(); }); // TickerFundamentals Configurations modelBuilder.Entity(entity => { entity.HasKey(e => e.Ticker); entity.HasIndex(e => e.Isin); }); } }