From 6b58dfa4e46552cac27fec0289f95c0951476474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=A0vr=C4=8Dina?= Date: Tue, 17 Mar 2026 00:28:31 +0100 Subject: [PATCH] Add BaseModel and AppDbContext with auto timestamps - BaseModel in Domain.Common with Id, Created, Updated, Deleted fields - AppDbContext in Infrastructure.Persistence overrides SaveChanges/Async to automatically set Created/Updated via ChangeTracker - Added EF Core 8 and Pomelo.EntityFrameworkCore.MySql 8 packages Co-Authored-By: Claude Sonnet 4.6 --- backend/ClaudeTest.Domain/Common/BaseModel.cs | 9 ++++ .../ClaudeTest.Infrastructure.csproj | 5 +++ .../Persistence/AppDbContext.cs | 42 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 backend/ClaudeTest.Domain/Common/BaseModel.cs create mode 100644 backend/ClaudeTest.Infrastructure/Persistence/AppDbContext.cs diff --git a/backend/ClaudeTest.Domain/Common/BaseModel.cs b/backend/ClaudeTest.Domain/Common/BaseModel.cs new file mode 100644 index 0000000..94ca85b --- /dev/null +++ b/backend/ClaudeTest.Domain/Common/BaseModel.cs @@ -0,0 +1,9 @@ +namespace ClaudeTest.Domain.Common; + +public abstract class BaseModel +{ + public int Id { get; set; } + public DateTime Created { get; set; } + public DateTime Updated { get; set; } + public DateTime? Deleted { get; set; } +} diff --git a/backend/ClaudeTest.Infrastructure/ClaudeTest.Infrastructure.csproj b/backend/ClaudeTest.Infrastructure/ClaudeTest.Infrastructure.csproj index d5ccce6..073aff5 100644 --- a/backend/ClaudeTest.Infrastructure/ClaudeTest.Infrastructure.csproj +++ b/backend/ClaudeTest.Infrastructure/ClaudeTest.Infrastructure.csproj @@ -5,6 +5,11 @@ + + + + + net8.0 enable diff --git a/backend/ClaudeTest.Infrastructure/Persistence/AppDbContext.cs b/backend/ClaudeTest.Infrastructure/Persistence/AppDbContext.cs new file mode 100644 index 0000000..41edd19 --- /dev/null +++ b/backend/ClaudeTest.Infrastructure/Persistence/AppDbContext.cs @@ -0,0 +1,42 @@ +using ClaudeTest.Domain.Common; +using Microsoft.EntityFrameworkCore; + +namespace ClaudeTest.Infrastructure.Persistence; + +public class AppDbContext : DbContext +{ + public AppDbContext(DbContextOptions options) : base(options) + { + } + + public override int SaveChanges() + { + SetTimestamps(); + return base.SaveChanges(); + } + + public override Task SaveChangesAsync(CancellationToken cancellationToken = default) + { + SetTimestamps(); + return base.SaveChangesAsync(cancellationToken); + } + + private void SetTimestamps() + { + var entries = ChangeTracker.Entries(); + + foreach (var entry in entries) + { + switch (entry.State) + { + case EntityState.Added: + entry.Entity.Created = DateTime.UtcNow; + entry.Entity.Updated = DateTime.UtcNow; + break; + case EntityState.Modified: + entry.Entity.Updated = DateTime.UtcNow; + break; + } + } + } +}