82 lines
3.1 KiB
C#
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.");
|
|
}
|
|
}
|
|
}
|
|
}
|