using FinlyticCore.Entities.Settings; using FinlyticTrades.Entities; using Microsoft.EntityFrameworkCore; namespace FinlyticTrades.Database; public class TradesDbContext : DbContext { public TradesDbContext(DbContextOptions options) : base(options) { } public DbSet DynamicSettings => Set(); public DbSet Trades => Set(); public DbSet TradeHourlyUpdates => Set(); public DbSet Settings => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.Key); }); var stringListConverter = new Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter, string>( v => System.Text.Json.JsonSerializer.Serialize(v, (System.Text.Json.JsonSerializerOptions?)null), v => System.Text.Json.JsonSerializer.Deserialize>(v, (System.Text.Json.JsonSerializerOptions?)null) ?? new List() ); var stringListComparer = new Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer>( (c1, c2) => c1 != null && c2 != null ? c1.SequenceEqual(c2) : c1 == c2, c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), c => c.ToList() ); modelBuilder.Entity(entity => { entity.HasIndex(e => e.TradeId).IsUnique(); entity.HasIndex(e => e.AnalysisId); entity.HasIndex(e => e.EventId); entity.HasIndex(e => e.Status); entity.HasIndex(e => e.Sector); entity.HasIndex(e => e.Isin); entity.HasIndex(e => e.CreatedAt); entity.Property(e => e.DerivativeProductCategories) .HasConversion(stringListConverter, stringListComparer); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.TradeId); entity.HasIndex(e => e.Timestamp); }); } }