namespace MyOffice.DbContext; using Data.Models.Accounts; using Data.Models.Currencies; using Data.Models.Items; using Microsoft.EntityFrameworkCore; using Data.Models.Users; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; public enum AppDbContextProvidersEnum { sqlite, mssql, npgsql } public class AppDbContext : DbContext { private readonly AppDbContextProvidersEnum _provider; private readonly Dictionary _noCaseCollation = new() { { AppDbContextProvidersEnum.sqlite, "NOCASE" }, { AppDbContextProvidersEnum.npgsql, "my_ci_collation" } }; public AppDbContext(AppDbContextProvidersEnum provider, DbContextOptions options) : base(options) { _provider = provider; } public DbSet Users { get; set; } = null!; public DbSet UserClaims { get; set; } = null!; public DbSet CurrencyGlobals { get; set; } = null!; public DbSet Currencies { get; set; } = null!; public DbSet CurrencyRates { get; set; } = null!; public DbSet AccountCategories { get; set; } = null!; public DbSet Accounts { get; set; } = null!; public DbSet AccountAccountCategories { get; set; } = null!; public DbSet AccountAccesses { get; set; } = null!; public DbSet ItemCategories { get; set; } = null!; public DbSet ItemGlobals { get; set; } = null!; public DbSet Items { get; set; } = null!; public DbSet Motions { get; set; } = null!; protected override void OnModelCreating(ModelBuilder modelBuilder) { var noCaseCollation = _noCaseCollation[_provider]; if (_provider == AppDbContextProvidersEnum.npgsql) modelBuilder.HasCollation("my_ci_collation", "en-u-ks-primary", "icu", false); /* NOCASE PROPERTIES */ modelBuilder.Entity() .Property(x => x.UserName) .UseCollation(noCaseCollation); modelBuilder.Entity() .Property(x => x.Email) .UseCollation(noCaseCollation); modelBuilder.Entity() .Property(x => x.Provider) .UseCollation(noCaseCollation); modelBuilder.Entity() .Property(x => x.Email) .UseCollation(noCaseCollation); modelBuilder.Entity() .HasOne(x => x.User) .WithMany(x => x.UserClaims) .HasForeignKey(x => x.UserId); UserCreating(modelBuilder); CurrencyCreating(modelBuilder); AccountCreating(modelBuilder); MotionsCreating(modelBuilder); base.OnModelCreating(modelBuilder); } private void UserCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasOne(x => x.Currency) .WithMany() .HasForeignKey(x => x.CurrencyId); } private void CurrencyCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasOne(x => x.CurrencyGlobal) .WithMany(x => x.Currencies) .HasForeignKey(x => x.CurrencyGlobalId); modelBuilder.Entity() .HasOne(x => x.User) .WithMany(x => x.Currencies) .HasForeignKey(x => x.UserId); modelBuilder.Entity() .HasOne(x => x.Currency) .WithMany(x => x.Rates) .HasForeignKey(x => x.CurrencyId); modelBuilder.Entity() .HasOne(x => x.CurrentRate) .WithMany(x => x.Currencies) .HasForeignKey(x => x.CurrentRateId); } private void AccountCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasOne(x => x.CurrencyGlobal) .WithMany(x => x.Accounts) .HasForeignKey(x => x.CurrencyGlobalId); modelBuilder.Entity() .HasOne(x => x.Owner) .WithMany(x => x.Accounts) .HasForeignKey(x => x.OwnerId); modelBuilder.Entity() .HasOne(x => x.Account) .WithMany(x => x.AccessRights) .HasForeignKey(x => x.AccountId); modelBuilder.Entity() .HasOne(x => x.User) .WithMany(x => x.AccountAccess) .HasForeignKey(x => x.UserId); modelBuilder.Entity() .HasOne(x => x.Account) .WithMany(x => x.Motions) .HasForeignKey(x => x.AccountId); modelBuilder.Entity() .HasOne(x => x.User) .WithMany(x => x.AccountCategories) .HasForeignKey(x => x.UserId); modelBuilder.Entity() .HasOne(x => x.Account) .WithMany(x => x.Categories) .HasForeignKey(x => x.AccountId); modelBuilder.Entity() .HasOne(x => x.Category) .WithMany(x => x.Accounts) .HasForeignKey(x => x.CategoryId); modelBuilder .Entity() .Property(d => d.Type) .HasConversion(new EnumToStringConverter()); } private void MotionsCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasOne(x => x.User) .WithMany(x => x.ItemCategories) .HasForeignKey(x => x.UserId); modelBuilder.Entity() .HasOne(x => x.Category) .WithMany(x => x.Items) .HasForeignKey(x => x.CategoryId); modelBuilder.Entity() .HasOne(x => x.ItemGlobal) .WithMany(x => x.Items) .HasForeignKey(x => x.ItemGlobalId); modelBuilder.Entity() .HasOne(x => x.Item) .WithMany(x => x.Motions) .HasForeignKey(x => x.ItemId); modelBuilder.Entity() .HasOne(x => x.Account) .WithMany(x => x.Motions) .HasForeignKey(x => x.AccountId); modelBuilder.Entity() .Property(x => x.AmountMinus) .HasPrecision(18, 6); modelBuilder.Entity() .Property(x => x.AmountPlus) .HasPrecision(18, 6); } }