98 lines
3.7 KiB
C#
98 lines
3.7 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);
|
|
}
|
|
|
|
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
|
|
{
|
|
base.ConfigureConventions(configurationBuilder);
|
|
|
|
configurationBuilder.Properties<DateTime>()
|
|
.HaveConversion(typeof(FinlyticCore.Converters.UtcDateTimeConverter));
|
|
configurationBuilder.Properties<DateTime?>()
|
|
.HaveConversion(typeof(FinlyticCore.Converters.NullableUtcDateTimeConverter));
|
|
}
|
|
}
|