using System; using System.Collections.Generic; using System.Linq; using FinlyticAssets.Entities; using FinlyticCore.Database; using FinlyticCore.Entities.Settings; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Design; namespace FinlyticAssets.Database; public class AssetsDbContext : DbContext, ISettingsDbContext { public AssetsDbContext(DbContextOptions options) : base(options) { } public DbSet DynamicSettings => Set(); public DbSet Settings { get; set; } public DbSet TradeRepublicAssets { get; set; } public DbSet TradeRepublicTags { get; 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 => new {e.Isin, e.InstrumentCategory}); entity.HasIndex(e => e.LastUpdatedAt); entity.HasDiscriminator("AssetType") .HasValue("Stock") .HasValue("Crypto") .HasValue("Etf") .HasValue("Synthetic") .HasValue("Bond") .HasValue("Derivative"); }); 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 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() .Property(e => e.DerivativeProductCategories) .HasConversion(stringListConverter, stringListComparer); modelBuilder.Entity() .Property(e => e.DerivativeProductCategories) .HasConversion(stringListConverter, stringListComparer); modelBuilder.Entity() .Property(e => e.DerivativeProductCategories) .HasConversion(stringListConverter, stringListComparer); modelBuilder.Entity() .Property(e => e.DerivativeProductCategories) .HasConversion(stringListConverter, stringListComparer); modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); }); modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.Property(e => e.CurrentScanningType) .HasConversion() .HasMaxLength(50); }); modelBuilder.Entity() .HasMany(a => a.Tags) .WithMany(t => t.Assets); } protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { base.ConfigureConventions(configurationBuilder); configurationBuilder.Properties() .HaveConversion(typeof(FinlyticCore.Converters.UtcDateTimeConverter)); configurationBuilder.Properties() .HaveConversion(typeof(FinlyticCore.Converters.NullableUtcDateTimeConverter)); } } public class AssetsDbContextFactory : IDesignTimeDbContextFactory { public AssetsDbContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseNpgsql("Host=localhost;Database=assets;Username=postgres;Password=postgres"); return new AssetsDbContext(optionsBuilder.Options); } }