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;
+ }
+ }
+ }
+}