Files
Finlytic/FinlyticAssets/Database/AssetsDbContext.cs
T

88 lines
3.3 KiB
C#

using FinlyticAssets.Entities;
using FinlyticCore.Entities.Settings;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
namespace FinlyticAssets.Database;
public class AssetsDbContext : DbContext
{
public AssetsDbContext(DbContextOptions<AssetsDbContext> options) : base(options)
{
}
public DbSet<SettingEntity> DynamicSettings => Set<SettingEntity>();
public DbSet<Settings> Settings { get; set; }
public DbSet<AssetEntity> TradeRepublicAssets { get; set; }
public DbSet<TagEntity> TradeRepublicTags { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<SettingEntity>(entity =>
{
entity.HasKey(e => e.Id);
entity.HasIndex(e => e.Key);
});
modelBuilder.Entity<AssetEntity>(entity =>
{
entity.HasKey(e => new {e.Isin, e.InstrumentCategory});
entity.HasIndex(e => e.LastUpdatedAt);
entity.HasDiscriminator<string>("AssetType")
.HasValue<StockEntity>("Stock")
.HasValue<CryptoEntity>("Crypto")
.HasValue<EtfEntity>("Etf")
.HasValue<SyntheticEntity>("Synthetic")
.HasValue<BondEntity>("Bond")
.HasValue<DerivativeEntity>("Derivative");
});
var stringListConverter =
new Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter<List<string>, string>(
v => System.Text.Json.JsonSerializer.Serialize(v, (System.Text.Json.JsonSerializerOptions?)null),
v => System.Text.Json.JsonSerializer.Deserialize<List<string>>(v,
(System.Text.Json.JsonSerializerOptions?)null) ?? new List<string>()
);
var stringListComparer = new ValueComparer<List<string>>(
(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<StockEntity>()
.Property(e => e.DerivativeProductCategories)
.HasConversion(stringListConverter, stringListComparer);
modelBuilder.Entity<SyntheticEntity>()
.Property(e => e.DerivativeProductCategories)
.HasConversion(stringListConverter, stringListComparer);
modelBuilder.Entity<DerivativeEntity>()
.Property(e => e.DerivativeProductCategories)
.HasConversion(stringListConverter, stringListComparer);
modelBuilder.Entity<EtfEntity>()
.Property(e => e.DerivativeProductCategories)
.HasConversion(stringListConverter, stringListComparer);
modelBuilder.Entity<TagEntity>(entity => { entity.HasKey(e => e.Id); });
modelBuilder.Entity<Settings>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.CurrentScanningType)
.HasConversion<string>()
.HasMaxLength(50);
});
modelBuilder.Entity<AssetEntity>()
.HasMany(a => a.Tags)
.WithMany(t => t.Assets);
}
}