Refactor DbModelOptions to use indexers for lookups

Replaced GetEntity and GetColumn extension methods with indexers
on DbModelOptions and EntityOptions. Updated all usages to use
the new indexer syntax, improving code clarity and error handling
for missing entity or column configurations.
This commit is contained in:
2026-03-25 16:10:50 +01:00
parent 1467acc4a1
commit 11ebfdd21e
4 changed files with 105 additions and 107 deletions

View File

@@ -1,6 +1,20 @@
using ReC.Application.Common.Exceptions;
namespace ReC.Application.Common.Options.DbModel; namespace ReC.Application.Common.Options.DbModel;
public class DbModelOptions public class DbModelOptions
{ {
public Dictionary<string, EntityOptions> Entities { get; set; } = []; public Dictionary<string, EntityOptions> Entities { get; set; } = [];
public EntityOptions this[string entityName]
{
get
{
if (Entities.TryGetValue(entityName, out var entity))
return entity;
throw new DbModelConfigurationException(
$"Entity '{entityName}' is not configured in DbModel options.");
}
}
} }

View File

@@ -1,25 +0,0 @@
using ReC.Application.Common.Exceptions;
namespace ReC.Application.Common.Options.DbModel;
public static class DbModelOptionsExtensions
{
public static EntityOptions GetEntity(this DbModelOptions options, string entityName)
{
if (options.Entities.TryGetValue(entityName, out var entity))
return entity;
throw new DbModelConfigurationException(
$"Entity '{entityName}' is not configured in DbModel options.");
}
public static string GetColumn(this EntityOptions entity, string entityName, string propertyName)
{
if (entity.ColumnMappings.TryGetValue(propertyName, out var columnName))
return columnName;
var viewDisplay = entity.Name ?? entityName;
throw new DbModelConfigurationException(
$"Column mapping for property '{propertyName}' is not configured for entity '{viewDisplay}'.");
}
}

View File

@@ -1,3 +1,5 @@
using ReC.Application.Common.Exceptions;
namespace ReC.Application.Common.Options.DbModel; namespace ReC.Application.Common.Options.DbModel;
public class EntityOptions public class EntityOptions
@@ -7,4 +9,17 @@ public class EntityOptions
public string Schema { get; set; } = "dbo"; public string Schema { get; set; } = "dbo";
public Dictionary<string, string> ColumnMappings { get; set; } = []; public Dictionary<string, string> ColumnMappings { get; set; } = [];
public string this[string propertyName]
{
get
{
if (ColumnMappings.TryGetValue(propertyName, out var columnName))
return columnName;
var viewDisplay = Name ?? "unknown";
throw new DbModelConfigurationException(
$"Column mapping for property '{propertyName}' is not configured for entity '{viewDisplay}'.");
}
}
} }

View File

@@ -39,47 +39,46 @@ public class RecDbContext(DbContextOptions<RecDbContext> options, IOptions<DbMod
private void ConfigureRecActionView(ModelBuilder modelBuilder) private void ConfigureRecActionView(ModelBuilder modelBuilder)
{ {
const string entityName = nameof(RecActionView); var opt = _dbModelOptions[nameof(RecActionView)];
var opt = _dbModelOptions.GetEntity(entityName);
modelBuilder.Entity<RecActionView>(b => modelBuilder.Entity<RecActionView>(b =>
{ {
b.ToView(opt.Name, opt.Schema); b.ToView(opt.Name, opt.Schema);
b.HasKey(e => e.Id); b.HasKey(e => e.Id);
b.Property(e => e.Id).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.Id))); b.Property(e => e.Id).HasColumnName(opt[nameof(RecActionView.Id)]);
b.Property(e => e.ProfileId).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.ProfileId))); b.Property(e => e.ProfileId).HasColumnName(opt[nameof(RecActionView.ProfileId)]);
b.Property(e => e.ProfileName).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.ProfileName))); b.Property(e => e.ProfileName).HasColumnName(opt[nameof(RecActionView.ProfileName)]);
b.Property(e => e.ProfileType).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.ProfileType))); b.Property(e => e.ProfileType).HasColumnName(opt[nameof(RecActionView.ProfileType)]);
b.Property(e => e.Sequence).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.Sequence))); b.Property(e => e.Sequence).HasColumnName(opt[nameof(RecActionView.Sequence)]);
b.Property(e => e.EndpointId).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointId))); b.Property(e => e.EndpointId).HasColumnName(opt[nameof(RecActionView.EndpointId)]);
b.Property(e => e.EndpointUri).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointUri))); b.Property(e => e.EndpointUri).HasColumnName(opt[nameof(RecActionView.EndpointUri)]);
b.Property(e => e.EndpointAuthId).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthId))); b.Property(e => e.EndpointAuthId).HasColumnName(opt[nameof(RecActionView.EndpointAuthId)]);
b.Property(e => e.EndpointAuthType).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthType))); b.Property(e => e.EndpointAuthType).HasColumnName(opt[nameof(RecActionView.EndpointAuthType)]);
b.Property(e => e.EndpointAuthTypeName).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthTypeName))); b.Property(e => e.EndpointAuthTypeName).HasColumnName(opt[nameof(RecActionView.EndpointAuthTypeName)]);
b.Property(e => e.EndpointAuthApiKey).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthApiKey))); b.Property(e => e.EndpointAuthApiKey).HasColumnName(opt[nameof(RecActionView.EndpointAuthApiKey)]);
b.Property(e => e.EndpointAuthApiValue).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthApiValue))); b.Property(e => e.EndpointAuthApiValue).HasColumnName(opt[nameof(RecActionView.EndpointAuthApiValue)]);
b.Property(e => e.EndpointAuthApiKeyAddTo).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthApiKeyAddTo))); b.Property(e => e.EndpointAuthApiKeyAddTo).HasColumnName(opt[nameof(RecActionView.EndpointAuthApiKeyAddTo)]);
b.Property(e => e.EndpointAuthApiKeyAddToName).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthApiKeyAddToName))); b.Property(e => e.EndpointAuthApiKeyAddToName).HasColumnName(opt[nameof(RecActionView.EndpointAuthApiKeyAddToName)]);
b.Property(e => e.EndpointAuthToken).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthToken))); b.Property(e => e.EndpointAuthToken).HasColumnName(opt[nameof(RecActionView.EndpointAuthToken)]);
b.Property(e => e.EndpointAuthUsername).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthUsername))); b.Property(e => e.EndpointAuthUsername).HasColumnName(opt[nameof(RecActionView.EndpointAuthUsername)]);
b.Property(e => e.EndpointAuthPassword).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthPassword))); b.Property(e => e.EndpointAuthPassword).HasColumnName(opt[nameof(RecActionView.EndpointAuthPassword)]);
b.Property(e => e.EndpointAuthDomain).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthDomain))); b.Property(e => e.EndpointAuthDomain).HasColumnName(opt[nameof(RecActionView.EndpointAuthDomain)]);
b.Property(e => e.EndpointAuthWorkstation).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthWorkstation))); b.Property(e => e.EndpointAuthWorkstation).HasColumnName(opt[nameof(RecActionView.EndpointAuthWorkstation)]);
b.Property(e => e.EndpointParamsId).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointParamsId))); b.Property(e => e.EndpointParamsId).HasColumnName(opt[nameof(RecActionView.EndpointParamsId)]);
b.Property(e => e.SqlConnectionId).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.SqlConnectionId))); b.Property(e => e.SqlConnectionId).HasColumnName(opt[nameof(RecActionView.SqlConnectionId)]);
b.Property(e => e.SqlConnectionServer).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.SqlConnectionServer))); b.Property(e => e.SqlConnectionServer).HasColumnName(opt[nameof(RecActionView.SqlConnectionServer)]);
b.Property(e => e.SqlConnectionDb).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.SqlConnectionDb))); b.Property(e => e.SqlConnectionDb).HasColumnName(opt[nameof(RecActionView.SqlConnectionDb)]);
b.Property(e => e.SqlConnectionUsername).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.SqlConnectionUsername))); b.Property(e => e.SqlConnectionUsername).HasColumnName(opt[nameof(RecActionView.SqlConnectionUsername)]);
b.Property(e => e.SqlConnectionPassword).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.SqlConnectionPassword))); b.Property(e => e.SqlConnectionPassword).HasColumnName(opt[nameof(RecActionView.SqlConnectionPassword)]);
b.Property(e => e.RestType).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.RestType))); b.Property(e => e.RestType).HasColumnName(opt[nameof(RecActionView.RestType)]);
b.Property(e => e.RestTypeName).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.RestTypeName))); b.Property(e => e.RestTypeName).HasColumnName(opt[nameof(RecActionView.RestTypeName)]);
b.Property(e => e.PreprocessingQuery).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.PreprocessingQuery))); b.Property(e => e.PreprocessingQuery).HasColumnName(opt[nameof(RecActionView.PreprocessingQuery)]);
b.Property(e => e.HeaderQuery).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.HeaderQuery))); b.Property(e => e.HeaderQuery).HasColumnName(opt[nameof(RecActionView.HeaderQuery)]);
b.Property(e => e.BodyQuery).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.BodyQuery))); b.Property(e => e.BodyQuery).HasColumnName(opt[nameof(RecActionView.BodyQuery)]);
b.Property(e => e.PostprocessingQuery).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.PostprocessingQuery))); b.Property(e => e.PostprocessingQuery).HasColumnName(opt[nameof(RecActionView.PostprocessingQuery)]);
b.Property(e => e.ErrorAction).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.ErrorAction))); b.Property(e => e.ErrorAction).HasColumnName(opt[nameof(RecActionView.ErrorAction)]);
b.Property(e => e.ErrorActionName).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.ErrorActionName))); b.Property(e => e.ErrorActionName).HasColumnName(opt[nameof(RecActionView.ErrorActionName)]);
b.HasMany(e => e.Results) b.HasMany(e => e.Results)
.WithOne(r => r.Action) .WithOne(r => r.Action)
@@ -89,61 +88,59 @@ public class RecDbContext(DbContextOptions<RecDbContext> options, IOptions<DbMod
private void ConfigureProfileView(ModelBuilder modelBuilder) private void ConfigureProfileView(ModelBuilder modelBuilder)
{ {
const string entityName = nameof(ProfileView); var opt = _dbModelOptions[nameof(ProfileView)];
var opt = _dbModelOptions.GetEntity(entityName);
modelBuilder.Entity<ProfileView>(b => modelBuilder.Entity<ProfileView>(b =>
{ {
b.ToView(opt.Name, opt.Schema); b.ToView(opt.Name, opt.Schema);
b.HasKey(e => e.Id); b.HasKey(e => e.Id);
b.Property(e => e.Id).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Id))); b.Property(e => e.Id).HasColumnName(opt[nameof(ProfileView.Id)]);
b.Property(e => e.Active).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Active))); b.Property(e => e.Active).HasColumnName(opt[nameof(ProfileView.Active)]);
b.Property(e => e.TypeId).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.TypeId))); b.Property(e => e.TypeId).HasColumnName(opt[nameof(ProfileView.TypeId)]);
b.Property(e => e.Type).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Type))); b.Property(e => e.Type).HasColumnName(opt[nameof(ProfileView.Type)]);
b.Property(e => e.Mandantor).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Mandantor))); b.Property(e => e.Mandantor).HasColumnName(opt[nameof(ProfileView.Mandantor)]);
b.Property(e => e.ProfileName).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.ProfileName))); b.Property(e => e.ProfileName).HasColumnName(opt[nameof(ProfileView.ProfileName)]);
b.Property(e => e.Description).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Description))); b.Property(e => e.Description).HasColumnName(opt[nameof(ProfileView.Description)]);
b.Property(e => e.LogLevelId).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.LogLevelId))); b.Property(e => e.LogLevelId).HasColumnName(opt[nameof(ProfileView.LogLevelId)]);
b.Property(e => e.LogLevel).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.LogLevel))); b.Property(e => e.LogLevel).HasColumnName(opt[nameof(ProfileView.LogLevel)]);
b.Property(e => e.LanguageId).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.LanguageId))); b.Property(e => e.LanguageId).HasColumnName(opt[nameof(ProfileView.LanguageId)]);
b.Property(e => e.Language).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Language))); b.Property(e => e.Language).HasColumnName(opt[nameof(ProfileView.Language)]);
b.Property(e => e.AddedWho).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.AddedWho))); b.Property(e => e.AddedWho).HasColumnName(opt[nameof(ProfileView.AddedWho)]);
b.Property(e => e.AddedWhen).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.AddedWhen))); b.Property(e => e.AddedWhen).HasColumnName(opt[nameof(ProfileView.AddedWhen)]);
b.Property(e => e.ChangedWho).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.ChangedWho))); b.Property(e => e.ChangedWho).HasColumnName(opt[nameof(ProfileView.ChangedWho)]);
b.Property(e => e.ChangedWhen).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.ChangedWhen))); b.Property(e => e.ChangedWhen).HasColumnName(opt[nameof(ProfileView.ChangedWhen)]);
b.Property(e => e.FirstRun).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.FirstRun))); b.Property(e => e.FirstRun).HasColumnName(opt[nameof(ProfileView.FirstRun)]);
b.Property(e => e.LastRun).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.LastRun))); b.Property(e => e.LastRun).HasColumnName(opt[nameof(ProfileView.LastRun)]);
b.Property(e => e.LastResult).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.LastResult))); b.Property(e => e.LastResult).HasColumnName(opt[nameof(ProfileView.LastResult)]);
}); });
} }
private void ConfigureResultView(ModelBuilder modelBuilder) private void ConfigureResultView(ModelBuilder modelBuilder)
{ {
const string entityName = nameof(ResultView); var opt = _dbModelOptions[nameof(ResultView)];
var opt = _dbModelOptions.GetEntity(entityName);
modelBuilder.Entity<ResultView>(b => modelBuilder.Entity<ResultView>(b =>
{ {
b.ToView(opt.Name, opt.Schema); b.ToView(opt.Name, opt.Schema);
b.HasKey(e => e.Id); b.HasKey(e => e.Id);
b.Property(e => e.Id).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Id))); b.Property(e => e.Id).HasColumnName(opt[nameof(ResultView.Id)]);
b.Property(e => e.ActionId).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.ActionId))); b.Property(e => e.ActionId).HasColumnName(opt[nameof(ResultView.ActionId)]);
b.Property(e => e.ProfileId).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.ProfileId))); b.Property(e => e.ProfileId).HasColumnName(opt[nameof(ResultView.ProfileId)]);
b.Property(e => e.ProfileName).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.ProfileName))); b.Property(e => e.ProfileName).HasColumnName(opt[nameof(ResultView.ProfileName)]);
b.Property(e => e.StatusCode).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.StatusCode))); b.Property(e => e.StatusCode).HasColumnName(opt[nameof(ResultView.StatusCode)]);
b.Property(e => e.StatusName).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.StatusName))); b.Property(e => e.StatusName).HasColumnName(opt[nameof(ResultView.StatusName)]);
b.Property(e => e.Type).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Type))); b.Property(e => e.Type).HasColumnName(opt[nameof(ResultView.Type)]);
b.Property(e => e.TypeName).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.TypeName))); b.Property(e => e.TypeName).HasColumnName(opt[nameof(ResultView.TypeName)]);
b.Property(e => e.Header).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Header))); b.Property(e => e.Header).HasColumnName(opt[nameof(ResultView.Header)]);
b.Property(e => e.Body).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Body))); b.Property(e => e.Body).HasColumnName(opt[nameof(ResultView.Body)]);
b.Property(e => e.Info).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Info))); b.Property(e => e.Info).HasColumnName(opt[nameof(ResultView.Info)]);
b.Property(e => e.Error).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Error))); b.Property(e => e.Error).HasColumnName(opt[nameof(ResultView.Error)]);
b.Property(e => e.AddedWho).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.AddedWho))); b.Property(e => e.AddedWho).HasColumnName(opt[nameof(ResultView.AddedWho)]);
b.Property(e => e.AddedWhen).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.AddedWhen))); b.Property(e => e.AddedWhen).HasColumnName(opt[nameof(ResultView.AddedWhen)]);
b.Property(e => e.ChangedWho).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.ChangedWho))); b.Property(e => e.ChangedWho).HasColumnName(opt[nameof(ResultView.ChangedWho)]);
b.Property(e => e.ChangedWhen).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.ChangedWhen))); b.Property(e => e.ChangedWhen).HasColumnName(opt[nameof(ResultView.ChangedWhen)]);
b.HasOne(r => r.Action) b.HasOne(r => r.Action)
.WithMany(a => a.Results) .WithMany(a => a.Results)
@@ -157,37 +154,34 @@ public class RecDbContext(DbContextOptions<RecDbContext> options, IOptions<DbMod
private void ConfigureHeaderQueryResult(ModelBuilder modelBuilder) private void ConfigureHeaderQueryResult(ModelBuilder modelBuilder)
{ {
const string entityName = nameof(HeaderQueryResult); var opt = _dbModelOptions[nameof(HeaderQueryResult)];
var opt = _dbModelOptions.GetEntity(entityName);
modelBuilder.Entity<HeaderQueryResult>(b => modelBuilder.Entity<HeaderQueryResult>(b =>
{ {
b.HasNoKey(); b.HasNoKey();
b.Property(e => e.RawHeader).HasColumnName(opt.GetColumn(entityName, nameof(HeaderQueryResult.RawHeader))); b.Property(e => e.RawHeader).HasColumnName(opt[nameof(HeaderQueryResult.RawHeader)]);
}); });
} }
private void ConfigureBodyQueryResult(ModelBuilder modelBuilder) private void ConfigureBodyQueryResult(ModelBuilder modelBuilder)
{ {
const string entityName = nameof(BodyQueryResult); var opt = _dbModelOptions[nameof(BodyQueryResult)];
var opt = _dbModelOptions.GetEntity(entityName);
modelBuilder.Entity<BodyQueryResult>(b => modelBuilder.Entity<BodyQueryResult>(b =>
{ {
b.HasNoKey(); b.HasNoKey();
b.Property(e => e.RawBody).HasColumnName(opt.GetColumn(entityName, nameof(BodyQueryResult.RawBody))); b.Property(e => e.RawBody).HasColumnName(opt[nameof(BodyQueryResult.RawBody)]);
}); });
} }
private void ConfigureInsertObjectResult(ModelBuilder modelBuilder) private void ConfigureInsertObjectResult(ModelBuilder modelBuilder)
{ {
const string entityName = nameof(InsertObjectResult); var opt = _dbModelOptions[nameof(InsertObjectResult)];
var opt = _dbModelOptions.GetEntity(entityName);
modelBuilder.Entity<InsertObjectResult>(b => modelBuilder.Entity<InsertObjectResult>(b =>
{ {
b.HasNoKey(); b.HasNoKey();
b.Property(e => e.NewObjectId).HasColumnName(opt.GetColumn(entityName, nameof(InsertObjectResult.NewObjectId))); b.Property(e => e.NewObjectId).HasColumnName(opt[nameof(InsertObjectResult.NewObjectId)]);
}); });
} }
} }