using BudgetApp.Enums; using Microsoft.EntityFrameworkCore; namespace BudgetApp.Storage { public class BudgetContext : DbContext { public BudgetContext() { } public BudgetContext(DbContextOptions options) : base(options) { } public DbSet Transactions { get; set; } public DbSet UpdateStatuses { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(entity => { entity.Property(x => x.Id).ValueGeneratedNever(); entity.ToTable("UpdateStatus", tableBuilder => { tableBuilder.HasCheckConstraint("CK_UpdateStatus_SingletonId", "`Id` = 1"); }); entity.HasData(new UpdateStatus { Id = 1, State = UpdateStatusState.Done, Created = new DateTime(2026, 1, 1, 0, 0, 0, DateTimeKind.Utc), Updated = new DateTime(2026, 1, 1, 0, 0, 0, DateTimeKind.Utc) }); }); base.OnModelCreating(modelBuilder); } public override async Task SaveChangesAsync(CancellationToken cancellationToken = default) { EnsureUpdateStatusChangesAreValid(); var entries = ChangeTracker .Entries() .Where(x => x.Entity is BaseModel && (x.State == EntityState.Added || x.State == EntityState.Modified)); foreach (var entityEntry in entries) { ((BaseModel)entityEntry.Entity).Updated = DateTime.Now; if (entityEntry.State == EntityState.Added) { ((BaseModel)entityEntry.Entity).Created = DateTime.Now; } } return await base.SaveChangesAsync(cancellationToken).ConfigureAwait(false); } public override int SaveChanges() { EnsureUpdateStatusChangesAreValid(); var entries = ChangeTracker .Entries() .Where(x => x.Entity is BaseModel && (x.State == EntityState.Added || x.State == EntityState.Modified)); foreach (var entityEntry in entries) { ((BaseModel)entityEntry.Entity).Updated = DateTime.Now; if (entityEntry.State == EntityState.Added) { ((BaseModel)entityEntry.Entity).Created = DateTime.Now; } } return base.SaveChanges(); } private void EnsureUpdateStatusChangesAreValid() { var invalidUpdateStatusChange = ChangeTracker .Entries() .Any(x => x.State is EntityState.Added or EntityState.Deleted); if (invalidUpdateStatusChange) { throw new InvalidOperationException("UpdateStatus is a singleton row. Add and delete operations are not allowed."); } } } }