using FinlyticCore.Database; using FinlyticCore.Entities.Settings; using FinlyticFundamentals.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; namespace FinlyticFundamentals.Database; public class FundamentalsDbContext : DbContext, ISettingsDbContext { public FundamentalsDbContext(DbContextOptions options) : base(options) { } public DbSet DynamicSettings => Set(); public DbSet AssetData => Set(); public DbSet FundamentalData => Set(); public DbSet KeyExecutives => Set(); public DbSet AssetEvents => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.Key).IsUnique(); }); modelBuilder.Entity(entity => { entity.HasKey(e => e.Isin); entity.OwnsOne(e => e.PrimaryTicker, t => { t.Property(p => p.Ticker).HasColumnName("PrimaryTicker").HasDefaultValue(string.Empty); t.Property(p => p.Exchange).HasColumnName("PrimaryTickerExchange").HasDefaultValue(string.Empty); }); entity.OwnsMany(e => e.AvailableTickers, t => { t.ToTable("Tickers"); t.WithOwner().HasForeignKey("AssetDataIsin"); t.Property("Id"); t.HasKey("Id"); t.Property(p => p.Ticker).HasColumnName("Ticker"); t.Property(p => p.Exchange).HasColumnName("Exchange"); t.HasIndex(p => p.Ticker); }); entity.HasMany(e => e.FundamentalData) .WithOne(e => e.AssetData) .HasForeignKey(e => e.AssetDataIsin) .OnDelete(DeleteBehavior.Cascade); entity.HasMany(e => e.KeyExecutives) .WithOne(e => e.AssetData) .HasForeignKey(e => e.AssetDataIsin) .OnDelete(DeleteBehavior.Cascade); entity.HasMany(e => e.AssetEvents) .WithOne(e => e.AssetData) .HasForeignKey(e => e.AssetDataIsin) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.OwnsOne(e => e.Ticker, t => { t.Property(p => p.Ticker).HasColumnName("Ticker").HasDefaultValue(string.Empty); t.Property(p => p.Exchange).HasColumnName("TickerExchange").HasDefaultValue(string.Empty); t.HasIndex(p => p.Ticker); }); entity.HasIndex(e => new { e.AssetDataIsin }); }); modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.Property(e => e.SortOrder).HasDefaultValue(0); entity.HasIndex(e => new { e.AssetDataIsin, e.SortOrder }); }); modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.OwnsOne(e => e.Ticker, t => { t.Property(p => p.Ticker).HasColumnName("Ticker").HasDefaultValue(string.Empty); t.Property(p => p.Exchange).HasColumnName("TickerExchange").HasDefaultValue(string.Empty); }); }); } } public class FundamentalsDbContextFactory : IDesignTimeDbContextFactory { public FundamentalsDbContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseNpgsql("Host=localhost;Database=fundamentals;Username=postgres;Password=postgres"); return new FundamentalsDbContext(optionsBuilder.Options); } }