namespace MyOffice.DbContext; using Data.Models.Account; using Microsoft.EntityFrameworkCore; using Data.Models.Users; 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!; 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); CurrencyCreating(modelBuilder); AccountCreating(modelBuilder); base.OnModelCreating(modelBuilder); } 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); } 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() .HasOne(x => x.CurrencyGlobal) .WithMany(x => x.Accounts) .HasForeignKey(x => x.CurrencyGlobalId); modelBuilder.Entity() .HasOne(x => x.Account) .WithMany(x => x.AccessRights) .HasForeignKey(x => x.AccountId); modelBuilder.Entity() .HasOne(x => x.User) .WithMany(x => x.AccessRights) .HasForeignKey(x => x.AccountId); } }