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; using MyOffice.Data.Models.Verifications; using MyOffice.Data.Models.Notifications; 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 AccountAccessInvites { 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!; public DbSet Verifications { get; set; } = null!; public DbSet EmailTemplates { 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); VerificationsCreating(modelBuilder); EmailTemplateCreating(modelBuilder); base.OnModelCreating(modelBuilder); } private void VerificationsCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasOne(x => x.User) .WithMany() .HasForeignKey(x => x.UserId); } private void EmailTemplateCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasKey(x => x.Id); } 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) { #region Account 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); #endregion Account #region AccountAccess modelBuilder.Entity() .HasKey(x => x.Id); 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.Owner) .WithMany(x => x.AccountAccessOwners) .HasForeignKey(x => x.OwnerId); modelBuilder .Entity() .Property(d => d.Type) .HasConversion(new EnumToStringConverter()); modelBuilder.Entity() .HasIndex(p => new { p.AccountId, p.UserId }) .IsUnique(); modelBuilder.Entity() .HasIndex(p => new { p.AccountId, p.OwnerId }) .IsUnique(); #endregion AccountAccess #region AccountAccessInvite modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasOne(x => x.User) .WithMany(x => x.AccountAccessInvites) .HasForeignKey(x => x.UserId); modelBuilder.Entity() .HasOne(x => x.Account) .WithMany(x => x.Invites) .HasForeignKey(x => x.AccountId); #endregion AccountAccessInvite #region Motion modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasOne(x => x.Account) .WithMany(x => x.Motions) .HasForeignKey(x => x.AccountId); #endregion Motion #region AccountCategory modelBuilder.Entity() .HasKey(x => x.Id); modelBuilder.Entity() .HasOne(x => x.User) .WithMany(x => x.AccountCategories) .HasForeignKey(x => x.UserId); #endregion AccountCategory #region AccountAccountCategory modelBuilder.Entity() .HasKey(x => x.Id); 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() .HasIndex(p => new { p.AccountId, p.CategoryId }) .IsUnique(); modelBuilder.Entity() .HasOne(x => x.Category) .WithMany(x => x.Accounts) .HasForeignKey(x => x.CategoryId); #endregion AccountAccountCategory } 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); } }