BudgetApp/BudgetApp.Storage/BudgetContext.cs
Martin Svrcina e14e552388 Initial commit
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 01:52:43 +01:00

82 lines
3.1 KiB
C#

using BudgetApp.Enums;
using Microsoft.EntityFrameworkCore;
namespace BudgetApp.Storage
{
public class BudgetContext : DbContext
{
public BudgetContext() { }
public BudgetContext(DbContextOptions options) : base(options) { }
public DbSet<Transaction> Transactions { get; set; }
public DbSet<UpdateStatus> UpdateStatuses { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UpdateStatus>(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<int> 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<UpdateStatus>()
.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.");
}
}
}
}