From 5c37b2ef928abb2b49fa6a574c63ac6f8c807d11 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 12 Aug 2026 16:18:35 +0200 Subject: [PATCH] Add EF Core In-Memory DB and repository pattern support Added the `Microsoft.EntityFrameworkCore.InMemory` package to enable an in-memory database for testing and lightweight storage. Introduced `MessagingServiceDbContext` with `DbSet` properties for `EmailAccount`, `ReceivedEmail`, and `EmailAttachment`. Configured entity relationships in `OnModelCreating`. Registered `MessagingServiceDbContext` and a generic repository (`IRepository<>`) in the dependency injection container. Updated namespaces and imports to support the new DbContext and repository. Improved project structure to enhance modularity and testability by leveraging EF Core's in-memory database. --- .../DependencyInjection.cs | 11 +++++++++ ...ata.MessagingService.Infrastructure.csproj | 1 + .../Persistence/MessagingServiceDbContext.cs | 23 ++++++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs index 5c18aad..0060fa5 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs @@ -1,10 +1,14 @@ using DigitalData.MessagingService.Application.Common.Interfaces; +using DigitalData.MessagingService.Application.Common.Interfaces.Repositories; +using DigitalData.MessagingService.Infrastructure.Persistence; using DigitalData.MessagingService.Infrastructure.Queue; +using DigitalData.MessagingService.Infrastructure.Repositories; using DigitalData.MessagingService.Infrastructure.Services; using DigitalData.MessagingService.Infrastructure.Services.Background; using DigitalData.MessagingService.Publisher; using DigitalData.MessagingService.RabbitMQ; using Microsoft.AspNetCore.DataProtection; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -54,6 +58,13 @@ public static class DependencyInjection services.AddMemoryCache(); + // --- Database (InMemory) --- + services.AddDbContext(options => + options.UseInMemoryDatabase("MessagingServiceDb")); + + services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); + return services; } } + diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DigitalData.MessagingService.Infrastructure.csproj b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DigitalData.MessagingService.Infrastructure.csproj index b3ec186..fabd55c 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DigitalData.MessagingService.Infrastructure.csproj +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DigitalData.MessagingService.Infrastructure.csproj @@ -25,6 +25,7 @@ + diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Persistence/MessagingServiceDbContext.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Persistence/MessagingServiceDbContext.cs index b94148f..7a0cdaa 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Persistence/MessagingServiceDbContext.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Persistence/MessagingServiceDbContext.cs @@ -1,11 +1,32 @@ +using DigitalData.MessagingService.Domain.Entities; using Microsoft.EntityFrameworkCore; namespace DigitalData.MessagingService.Infrastructure.Persistence; /// /// Entity Framework Core DbContext for MessagingService. -/// IMPORTANT: This context maps to a LEGACY database - NO schema modifications allowed! /// public class MessagingServiceDbContext(DbContextOptions options) : DbContext(options) { + public DbSet EmailAccounts => Set(); + public DbSet ReceivedEmails => Set(); + public DbSet EmailAttachments => Set(); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity(entity => + { + entity.HasMany(e => e.Attachments) + .WithOne(a => a.Email) + .HasForeignKey(a => a.EmailId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(e => e.Account) + .WithMany() + .HasForeignKey(e => e.AccountId) + .OnDelete(DeleteBehavior.Restrict); + }); + } }