From 6c2b1884d2dd49eb9007aaa0176f4d4aa353848d Mon Sep 17 00:00:00 2001 From: OlgunR Date: Mon, 19 Jan 2026 16:25:08 +0100 Subject: [PATCH] Configurable EF view/column mapping via appsettings Refactor ApplicationDbContext to use a configuration-driven approach for mapping view and column names, enabling dynamic mapping through appsettings.json. Add TableConfigurations classes, update DI registration, and include the necessary options package for configuration binding. This improves maintainability and flexibility for schema changes. --- DbFirst.API/appsettings.json | 12 +++++++++ .../ApplicationDbContext.cs | 25 +++++++++++-------- .../DbFirst.Infrastructure.csproj | 1 + DbFirst.Infrastructure/DependencyInjection.cs | 1 + DbFirst.Infrastructure/TableConfigurations.cs | 19 ++++++++++++++ 5 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 DbFirst.Infrastructure/TableConfigurations.cs diff --git a/DbFirst.API/appsettings.json b/DbFirst.API/appsettings.json index c0ba046..ebaa255 100644 --- a/DbFirst.API/appsettings.json +++ b/DbFirst.API/appsettings.json @@ -8,6 +8,18 @@ "http://localhost:5101" ] }, + "TableConfigurations": { + "VwmyCatalog": { + "ViewName": "VWMY_CATALOG", + "GuidColumnName": "GUID", + "CatTitleColumnName": "CAT_TITLE", + "CatStringColumnName": "CAT_STRING", + "AddedWhoColumnName": "ADDED_WHO", + "AddedWhenColumnName": "ADDED_WHEN", + "ChangedWhoColumnName": "CHANGED_WHO", + "ChangedWhenColumnName": "CHANGED_WHEN" + } + }, "Logging": { "LogLevel": { "Default": "Information", diff --git a/DbFirst.Infrastructure/ApplicationDbContext.cs b/DbFirst.Infrastructure/ApplicationDbContext.cs index 278a43c..dc3cc30 100644 --- a/DbFirst.Infrastructure/ApplicationDbContext.cs +++ b/DbFirst.Infrastructure/ApplicationDbContext.cs @@ -1,49 +1,54 @@ using DbFirst.Domain.Entities; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; namespace DbFirst.Infrastructure; public partial class ApplicationDbContext : DbContext { - public ApplicationDbContext(DbContextOptions options) + private readonly TableConfigurations _config; + + public ApplicationDbContext(DbContextOptions options, IOptionsMonitor configOptions) : base(options) { + _config = configOptions.CurrentValue; } public virtual DbSet VwmyCatalogs { get; set; } - // TODO: Configure column names on appsettings via IConfiguration protected override void OnModelCreating(ModelBuilder modelBuilder) { + var catCfg = _config.VwmyCatalog; + modelBuilder.Entity(entity => { entity.HasKey(e => e.Guid); - entity.ToView("VWMY_CATALOG"); + entity.ToView(catCfg.ViewName); - entity.Property(e => e.Guid).HasColumnName("GUID"); + entity.Property(e => e.Guid).HasColumnName(catCfg.GuidColumnName); entity.Property(e => e.AddedWho) .HasMaxLength(30) .IsUnicode(false) - .HasColumnName("ADDED_WHO"); + .HasColumnName(catCfg.AddedWhoColumnName); entity.Property(e => e.AddedWhen) .HasColumnType("datetime") - .HasColumnName("ADDED_WHEN"); + .HasColumnName(catCfg.AddedWhenColumnName); entity.Property(e => e.CatString) .HasMaxLength(900) .IsUnicode(false) - .HasColumnName("CAT_STRING"); + .HasColumnName(catCfg.CatStringColumnName); entity.Property(e => e.CatTitle) .HasMaxLength(100) .IsUnicode(false) - .HasColumnName("CAT_TITLE"); + .HasColumnName(catCfg.CatTitleColumnName); entity.Property(e => e.ChangedWhen) .HasColumnType("datetime") - .HasColumnName("CHANGED_WHEN"); + .HasColumnName(catCfg.ChangedWhenColumnName); entity.Property(e => e.ChangedWho) .HasMaxLength(30) .IsUnicode(false) - .HasColumnName("CHANGED_WHO"); + .HasColumnName(catCfg.ChangedWhoColumnName); }); OnModelCreatingPartial(modelBuilder); diff --git a/DbFirst.Infrastructure/DbFirst.Infrastructure.csproj b/DbFirst.Infrastructure/DbFirst.Infrastructure.csproj index 654e162..5a8052a 100644 --- a/DbFirst.Infrastructure/DbFirst.Infrastructure.csproj +++ b/DbFirst.Infrastructure/DbFirst.Infrastructure.csproj @@ -16,6 +16,7 @@ + diff --git a/DbFirst.Infrastructure/DependencyInjection.cs b/DbFirst.Infrastructure/DependencyInjection.cs index 7099eb5..d01436f 100644 --- a/DbFirst.Infrastructure/DependencyInjection.cs +++ b/DbFirst.Infrastructure/DependencyInjection.cs @@ -8,6 +8,7 @@ public static class DependencyInjection { public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration) { + services.Configure(configuration.GetSection("TableConfigurations")); services.AddDbContext(options => options.UseSqlServer(configuration.GetConnectionString("DefaultConnection"))); return services; diff --git a/DbFirst.Infrastructure/TableConfigurations.cs b/DbFirst.Infrastructure/TableConfigurations.cs new file mode 100644 index 0000000..b6c29ef --- /dev/null +++ b/DbFirst.Infrastructure/TableConfigurations.cs @@ -0,0 +1,19 @@ +namespace DbFirst.Infrastructure +{ + public class TableConfigurations + { + public VwmyCatalogConfiguration VwmyCatalog { get; set; } = new(); + } + + public class VwmyCatalogConfiguration + { + public string ViewName { get; set; } = "VWMY_CATALOG"; + public string GuidColumnName { get; set; } = "GUID"; + public string CatTitleColumnName { get; set; } = "CAT_TITLE"; + public string CatStringColumnName { get; set; } = "CAT_STRING"; + public string AddedWhoColumnName { get; set; } = "ADDED_WHO"; + public string AddedWhenColumnName { get; set; } = "ADDED_WHEN"; + public string ChangedWhoColumnName { get; set; } = "CHANGED_WHO"; + public string ChangedWhenColumnName { get; set; } = "CHANGED_WHEN"; + } +}