Make RecDbContext model mapping fully configurable

Refactored RecDbContext to use DbModelOptions injected via IOptions, replacing hardcoded view and column names with configuration-driven mappings. This enables dynamic control of entity-to-database mapping through appsettings.json, improving flexibility and maintainability.
This commit is contained in:
2026-03-25 13:29:29 +01:00
parent 37ba85d681
commit 2e83d4a24a

View File

@@ -1,12 +1,16 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using ReC.Application.Common.Interfaces; using ReC.Application.Common.Interfaces;
using ReC.Application.Common.Options.DbModel;
using ReC.Domain.QueryOutput; using ReC.Domain.QueryOutput;
using ReC.Domain.Views; using ReC.Domain.Views;
namespace ReC.Infrastructure; namespace ReC.Infrastructure;
public class RecDbContext(DbContextOptions<RecDbContext> options) : DbContext(options), IRecDbContext public class RecDbContext(DbContextOptions<RecDbContext> options, IOptions<DbModelOptions> dbModelOptions) : DbContext(options), IRecDbContext
{ {
private readonly DbModelOptions _dbModelOptions = dbModelOptions.Value;
#region DB Sets #region DB Sets
public DbSet<RecActionView> RecActionViews { get; set; } public DbSet<RecActionView> RecActionViews { get; set; }
@@ -21,100 +25,102 @@ public class RecDbContext(DbContextOptions<RecDbContext> options) : DbContext(op
public DbSet<InsertObjectResult> RecResults { get; set; } public DbSet<InsertObjectResult> RecResults { get; set; }
#endregion DB Sets #endregion DB Sets
// TODO: Update to configure via appsettings.json
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
var actionOpt = _dbModelOptions.RecActionView;
modelBuilder.Entity<RecActionView>(b => modelBuilder.Entity<RecActionView>(b =>
{ {
b.ToView("VWREC_ACTION", "dbo"); b.ToView(actionOpt.View.Name, actionOpt.View.Schema);
b.HasKey(e => e.Id); b.HasKey(e => e.Id);
b.Property(e => e.Id).HasColumnName("ACTION_GUID"); b.Property(e => e.Id).HasColumnName(actionOpt.Id);
b.Property(e => e.ProfileId).HasColumnName("PROFILE_ID"); b.Property(e => e.ProfileId).HasColumnName(actionOpt.ProfileId);
b.Property(e => e.ProfileName).HasColumnName("PROFILE_NAME"); b.Property(e => e.ProfileName).HasColumnName(actionOpt.ProfileName);
b.Property(e => e.ProfileType).HasColumnName("PROFILE_TYPE_ID"); b.Property(e => e.ProfileType).HasColumnName(actionOpt.ProfileType);
b.Property(e => e.Sequence).HasColumnName("SEQUENCE"); b.Property(e => e.Sequence).HasColumnName(actionOpt.Sequence);
b.Property(e => e.EndpointId).HasColumnName("ENDPOINT_ID"); b.Property(e => e.EndpointId).HasColumnName(actionOpt.EndpointId);
b.Property(e => e.EndpointUri).HasColumnName("ENDPOINT_URI"); b.Property(e => e.EndpointUri).HasColumnName(actionOpt.EndpointUri);
b.Property(e => e.EndpointAuthId).HasColumnName("ENDPOINT_AUTH_ID"); b.Property(e => e.EndpointAuthId).HasColumnName(actionOpt.EndpointAuthId);
b.Property(e => e.EndpointAuthType).HasColumnName("ENDPOINT_AUTH_TYPE_ID"); b.Property(e => e.EndpointAuthType).HasColumnName(actionOpt.EndpointAuthType);
b.Property(e => e.EndpointAuthTypeName).HasColumnName("ENDPOINT_AUTH_TYPE"); b.Property(e => e.EndpointAuthTypeName).HasColumnName(actionOpt.EndpointAuthTypeName);
b.Property(e => e.EndpointAuthApiKey).HasColumnName("ENDPOINT_AUTH_API_KEY"); b.Property(e => e.EndpointAuthApiKey).HasColumnName(actionOpt.EndpointAuthApiKey);
b.Property(e => e.EndpointAuthApiValue).HasColumnName("ENDPOINT_AUTH_API_VALUE"); b.Property(e => e.EndpointAuthApiValue).HasColumnName(actionOpt.EndpointAuthApiValue);
b.Property(e => e.EndpointAuthApiKeyAddTo).HasColumnName("ENDPOINT_AUTH_API_KEY_ADD_TO_ID"); b.Property(e => e.EndpointAuthApiKeyAddTo).HasColumnName(actionOpt.EndpointAuthApiKeyAddTo);
b.Property(e => e.EndpointAuthApiKeyAddToName).HasColumnName("ENDPOINT_AUTH_API_KEY_ADD_TO"); b.Property(e => e.EndpointAuthApiKeyAddToName).HasColumnName(actionOpt.EndpointAuthApiKeyAddToName);
b.Property(e => e.EndpointAuthToken).HasColumnName("ENDPOINT_AUTH_TOKEN"); b.Property(e => e.EndpointAuthToken).HasColumnName(actionOpt.EndpointAuthToken);
b.Property(e => e.EndpointAuthUsername).HasColumnName("ENDPOINT_AUTH_USERNAME"); b.Property(e => e.EndpointAuthUsername).HasColumnName(actionOpt.EndpointAuthUsername);
b.Property(e => e.EndpointAuthPassword).HasColumnName("ENDPOINT_AUTH_PASSWORD"); b.Property(e => e.EndpointAuthPassword).HasColumnName(actionOpt.EndpointAuthPassword);
b.Property(e => e.EndpointAuthDomain).HasColumnName("ENDPOINT_AUTH_DOMAIN"); b.Property(e => e.EndpointAuthDomain).HasColumnName(actionOpt.EndpointAuthDomain);
b.Property(e => e.EndpointAuthWorkstation).HasColumnName("ENDPOINT_AUTH_WORKSTATION"); b.Property(e => e.EndpointAuthWorkstation).HasColumnName(actionOpt.EndpointAuthWorkstation);
b.Property(e => e.EndpointParamsId).HasColumnName("ENDPOINT_PARAMS_ID"); b.Property(e => e.EndpointParamsId).HasColumnName(actionOpt.EndpointParamsId);
b.Property(e => e.SqlConnectionId).HasColumnName("SQL_CONNECTION_ID"); b.Property(e => e.SqlConnectionId).HasColumnName(actionOpt.SqlConnectionId);
b.Property(e => e.SqlConnectionServer).HasColumnName("SQL_CONNECTION_SERVER"); b.Property(e => e.SqlConnectionServer).HasColumnName(actionOpt.SqlConnectionServer);
b.Property(e => e.SqlConnectionDb).HasColumnName("SQL_CONNECTION_DB"); b.Property(e => e.SqlConnectionDb).HasColumnName(actionOpt.SqlConnectionDb);
b.Property(e => e.SqlConnectionUsername).HasColumnName("SQL_CONNECTION_USERNAME"); b.Property(e => e.SqlConnectionUsername).HasColumnName(actionOpt.SqlConnectionUsername);
b.Property(e => e.SqlConnectionPassword).HasColumnName("SQL_CONNECTION_PASSWORD"); b.Property(e => e.SqlConnectionPassword).HasColumnName(actionOpt.SqlConnectionPassword);
b.Property(e => e.RestType).HasColumnName("REST_TYPE_ID"); b.Property(e => e.RestType).HasColumnName(actionOpt.RestType);
b.Property(e => e.RestTypeName).HasColumnName("REST_TYPE"); b.Property(e => e.RestTypeName).HasColumnName(actionOpt.RestTypeName);
b.Property(e => e.PreprocessingQuery).HasColumnName("PREPROCESSING_QUERY"); b.Property(e => e.PreprocessingQuery).HasColumnName(actionOpt.PreprocessingQuery);
b.Property(e => e.HeaderQuery).HasColumnName("HEADER_QUERY"); b.Property(e => e.HeaderQuery).HasColumnName(actionOpt.HeaderQuery);
b.Property(e => e.BodyQuery).HasColumnName("BODY_QUERY"); b.Property(e => e.BodyQuery).HasColumnName(actionOpt.BodyQuery);
b.Property(e => e.PostprocessingQuery).HasColumnName("POSTPROCESSING_QUERY"); b.Property(e => e.PostprocessingQuery).HasColumnName(actionOpt.PostprocessingQuery);
b.Property(e => e.ErrorAction).HasColumnName("ERROR_ACTION_ID"); b.Property(e => e.ErrorAction).HasColumnName(actionOpt.ErrorAction);
b.Property(e => e.ErrorActionName).HasColumnName("ERROR_ACTION"); b.Property(e => e.ErrorActionName).HasColumnName(actionOpt.ErrorActionName);
b.HasMany(e => e.Results) b.HasMany(e => e.Results)
.WithOne(r => r.Action) .WithOne(r => r.Action)
.HasForeignKey(r => r.ActionId); .HasForeignKey(r => r.ActionId);
}); });
var profileOpt = _dbModelOptions.ProfileView;
modelBuilder.Entity<ProfileView>(b => modelBuilder.Entity<ProfileView>(b =>
{ {
b.ToView("VWREC_PROFILE", "dbo"); b.ToView(profileOpt.View.Name, profileOpt.View.Schema);
b.HasKey(e => e.Id); b.HasKey(e => e.Id);
b.Property(e => e.Id).HasColumnName("PROFILE_GUID"); b.Property(e => e.Id).HasColumnName(profileOpt.Id);
b.Property(e => e.Active).HasColumnName("ACTIVE"); b.Property(e => e.Active).HasColumnName(profileOpt.Active);
b.Property(e => e.TypeId).HasColumnName("TYPE_ID"); b.Property(e => e.TypeId).HasColumnName(profileOpt.TypeId);
b.Property(e => e.Type).HasColumnName("TYPE"); b.Property(e => e.Type).HasColumnName(profileOpt.Type);
b.Property(e => e.Mandantor).HasColumnName("MANDANTOR"); b.Property(e => e.Mandantor).HasColumnName(profileOpt.Mandantor);
b.Property(e => e.ProfileName).HasColumnName("PROFILE_NAME"); b.Property(e => e.ProfileName).HasColumnName(profileOpt.ProfileName);
b.Property(e => e.Description).HasColumnName("DESCRIPTION"); b.Property(e => e.Description).HasColumnName(profileOpt.Description);
b.Property(e => e.LogLevelId).HasColumnName("LOG_LEVEL_ID"); b.Property(e => e.LogLevelId).HasColumnName(profileOpt.LogLevelId);
b.Property(e => e.LogLevel).HasColumnName("LOG_LEVEL"); b.Property(e => e.LogLevel).HasColumnName(profileOpt.LogLevel);
b.Property(e => e.LanguageId).HasColumnName("LANGUAGE_ID"); b.Property(e => e.LanguageId).HasColumnName(profileOpt.LanguageId);
b.Property(e => e.Language).HasColumnName("LANGUAGE"); b.Property(e => e.Language).HasColumnName(profileOpt.Language);
b.Property(e => e.AddedWho).HasColumnName("ADDED_WHO"); b.Property(e => e.AddedWho).HasColumnName(profileOpt.AddedWho);
b.Property(e => e.AddedWhen).HasColumnName("ADDED_WHEN"); b.Property(e => e.AddedWhen).HasColumnName(profileOpt.AddedWhen);
b.Property(e => e.ChangedWho).HasColumnName("CHANGED_WHO"); b.Property(e => e.ChangedWho).HasColumnName(profileOpt.ChangedWho);
b.Property(e => e.ChangedWhen).HasColumnName("CHANGED_WHEN"); b.Property(e => e.ChangedWhen).HasColumnName(profileOpt.ChangedWhen);
b.Property(e => e.FirstRun).HasColumnName("FIRST_RUN"); b.Property(e => e.FirstRun).HasColumnName(profileOpt.FirstRun);
b.Property(e => e.LastRun).HasColumnName("LAST_RUN"); b.Property(e => e.LastRun).HasColumnName(profileOpt.LastRun);
b.Property(e => e.LastResult).HasColumnName("LAST_RESULT"); b.Property(e => e.LastResult).HasColumnName(profileOpt.LastResult);
}); });
var resultOpt = _dbModelOptions.ResultView;
modelBuilder.Entity<ResultView>(b => modelBuilder.Entity<ResultView>(b =>
{ {
b.ToView("VWREC_RESULT", "dbo"); b.ToView(resultOpt.View.Name, resultOpt.View.Schema);
b.HasKey(e => e.Id); b.HasKey(e => e.Id);
b.Property(e => e.Id).HasColumnName("RESULT_GUID"); b.Property(e => e.Id).HasColumnName(resultOpt.Id);
b.Property(e => e.ActionId).HasColumnName("ACTION_ID"); b.Property(e => e.ActionId).HasColumnName(resultOpt.ActionId);
b.Property(e => e.ProfileId).HasColumnName("PROFILE_ID"); b.Property(e => e.ProfileId).HasColumnName(resultOpt.ProfileId);
b.Property(e => e.ProfileName).HasColumnName("PROFILE_NAME"); b.Property(e => e.ProfileName).HasColumnName(resultOpt.ProfileName);
b.Property(e => e.StatusCode).HasColumnName("STATUS_ID"); b.Property(e => e.StatusCode).HasColumnName(resultOpt.StatusCode);
b.Property(e => e.StatusName).HasColumnName("STATUS"); b.Property(e => e.StatusName).HasColumnName(resultOpt.StatusName);
b.Property(e => e.Type).HasColumnName("RESULT_TYPE_ID"); b.Property(e => e.Type).HasColumnName(resultOpt.Type);
b.Property(e => e.TypeName).HasColumnName("RESULT_TYPE"); b.Property(e => e.TypeName).HasColumnName(resultOpt.TypeName);
b.Property(e => e.Header).HasColumnName("RESULT_HEADER"); b.Property(e => e.Header).HasColumnName(resultOpt.Header);
b.Property(e => e.Body).HasColumnName("RESULT_BODY"); b.Property(e => e.Body).HasColumnName(resultOpt.Body);
b.Property(e => e.Info).HasColumnName("RESULT_INFO"); b.Property(e => e.Info).HasColumnName(resultOpt.Info);
b.Property(e => e.Error).HasColumnName("RESULT_ERROR"); b.Property(e => e.Error).HasColumnName(resultOpt.Error);
b.Property(e => e.AddedWho).HasColumnName("ADDED_WHO"); b.Property(e => e.AddedWho).HasColumnName(resultOpt.AddedWho);
b.Property(e => e.AddedWhen).HasColumnName("ADDED_WHEN"); b.Property(e => e.AddedWhen).HasColumnName(resultOpt.AddedWhen);
b.Property(e => e.ChangedWho).HasColumnName("CHANGED_WHO"); b.Property(e => e.ChangedWho).HasColumnName(resultOpt.ChangedWho);
b.Property(e => e.ChangedWhen).HasColumnName("CHANGED_WHEN"); b.Property(e => e.ChangedWhen).HasColumnName(resultOpt.ChangedWhen);
b.HasOne(r => r.Action) b.HasOne(r => r.Action)
.WithMany(a => a.Results) .WithMany(a => a.Results)
@@ -125,22 +131,25 @@ public class RecDbContext(DbContextOptions<RecDbContext> options) : DbContext(op
.HasForeignKey(r => r.ProfileId); .HasForeignKey(r => r.ProfileId);
}); });
var headerOpt = _dbModelOptions.HeaderQueryResult;
modelBuilder.Entity<HeaderQueryResult>(b => modelBuilder.Entity<HeaderQueryResult>(b =>
{ {
b.HasNoKey(); b.HasNoKey();
b.Property(e => e.RawHeader).HasColumnName("REQUEST_HEADER"); b.Property(e => e.RawHeader).HasColumnName(headerOpt.RawHeader);
}); });
var bodyOpt = _dbModelOptions.BodyQueryResult;
modelBuilder.Entity<BodyQueryResult>(b => modelBuilder.Entity<BodyQueryResult>(b =>
{ {
b.HasNoKey(); b.HasNoKey();
b.Property(e => e.RawBody).HasColumnName("REQUEST_BODY"); b.Property(e => e.RawBody).HasColumnName(bodyOpt.RawBody);
}); });
var insertOpt = _dbModelOptions.InsertObjectResult;
modelBuilder.Entity<InsertObjectResult>(b => modelBuilder.Entity<InsertObjectResult>(b =>
{ {
b.HasNoKey(); b.HasNoKey();
b.Property(e => e.NewObjectId).HasColumnName("oGUID"); b.Property(e => e.NewObjectId).HasColumnName(insertOpt.NewObjectId);
}); });
} }
} }