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.
This commit is contained in:
OlgunR
2026-01-19 16:25:08 +01:00
parent 3653def773
commit 6c2b1884d2
5 changed files with 48 additions and 10 deletions

View File

@@ -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",

View File

@@ -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<ApplicationDbContext> options)
private readonly TableConfigurations _config;
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IOptionsMonitor<TableConfigurations> configOptions)
: base(options)
{
_config = configOptions.CurrentValue;
}
public virtual DbSet<VwmyCatalog> VwmyCatalogs { get; set; }
// TODO: Configure column names on appsettings via IConfiguration
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var catCfg = _config.VwmyCatalog;
modelBuilder.Entity<VwmyCatalog>(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);

View File

@@ -16,6 +16,7 @@
</PackageReference>
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.2.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -8,6 +8,7 @@ public static class DependencyInjection
{
public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
{
services.Configure<TableConfigurations>(configuration.GetSection("TableConfigurations"));
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(configuration.GetConnectionString("DefaultConnection")));
return services;

View File

@@ -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";
}
}