75 lines
2.9 KiB
C#
75 lines
2.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using FinlyticCore.Database;
|
|
using FinlyticCore.Entities.Settings;
|
|
using FinlyticTrades.Entities;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Design;
|
|
|
|
namespace FinlyticTrades.Database;
|
|
|
|
public class TradesDbContext : DbContext, ISettingsDbContext
|
|
{
|
|
public TradesDbContext(DbContextOptions<TradesDbContext> options) : base(options) { }
|
|
|
|
public DbSet<SettingEntity> DynamicSettings => Set<SettingEntity>();
|
|
public DbSet<TradeEntity> Trades => Set<TradeEntity>();
|
|
public DbSet<TradeHourlyUpdateEntity> TradeHourlyUpdates => Set<TradeHourlyUpdateEntity>();
|
|
public DbSet<TradesSettingsEntity> Settings => Set<TradesSettingsEntity>();
|
|
|
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
{
|
|
base.OnModelCreating(modelBuilder);
|
|
|
|
modelBuilder.Entity<SettingEntity>(entity =>
|
|
{
|
|
entity.HasKey(e => e.Id);
|
|
entity.HasIndex(e => e.Key).IsUnique();
|
|
});
|
|
|
|
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 Microsoft.EntityFrameworkCore.ChangeTracking.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<TradeEntity>(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<TradeHourlyUpdateEntity>(entity =>
|
|
{
|
|
entity.HasIndex(e => e.TradeId);
|
|
entity.HasIndex(e => e.Timestamp);
|
|
});
|
|
}
|
|
}
|
|
|
|
public class TradesDbContextFactory : IDesignTimeDbContextFactory<TradesDbContext>
|
|
{
|
|
public TradesDbContext CreateDbContext(string[] args)
|
|
{
|
|
var optionsBuilder = new DbContextOptionsBuilder<TradesDbContext>();
|
|
optionsBuilder.UseNpgsql("Host=localhost;Database=trades;Username=postgres;Password=postgres");
|
|
return new TradesDbContext(optionsBuilder.Options);
|
|
}
|
|
}
|