From 11ebfdd21eca0a3112a7cbd84658d311691bf863 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 25 Mar 2026 16:10:50 +0100 Subject: [PATCH] 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. --- .../Common/Options/DbModel/DbModelOptions.cs | 14 ++ .../DbModel/DbModelOptionsExtensions.cs | 25 --- .../Common/Options/DbModel/EntityOptions.cs | 15 ++ src/ReC.Infrastructure/RecDbContext.cs | 158 +++++++++--------- 4 files changed, 105 insertions(+), 107 deletions(-) delete mode 100644 src/ReC.Application/Common/Options/DbModel/DbModelOptionsExtensions.cs diff --git a/src/ReC.Application/Common/Options/DbModel/DbModelOptions.cs b/src/ReC.Application/Common/Options/DbModel/DbModelOptions.cs index ff3874d..47d8ea1 100644 --- a/src/ReC.Application/Common/Options/DbModel/DbModelOptions.cs +++ b/src/ReC.Application/Common/Options/DbModel/DbModelOptions.cs @@ -1,6 +1,20 @@ +using ReC.Application.Common.Exceptions; + namespace ReC.Application.Common.Options.DbModel; public class DbModelOptions { public Dictionary 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."); + } + } } diff --git a/src/ReC.Application/Common/Options/DbModel/DbModelOptionsExtensions.cs b/src/ReC.Application/Common/Options/DbModel/DbModelOptionsExtensions.cs deleted file mode 100644 index e16a68a..0000000 --- a/src/ReC.Application/Common/Options/DbModel/DbModelOptionsExtensions.cs +++ /dev/null @@ -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}'."); - } -} diff --git a/src/ReC.Application/Common/Options/DbModel/EntityOptions.cs b/src/ReC.Application/Common/Options/DbModel/EntityOptions.cs index 6b551d0..8d79bc1 100644 --- a/src/ReC.Application/Common/Options/DbModel/EntityOptions.cs +++ b/src/ReC.Application/Common/Options/DbModel/EntityOptions.cs @@ -1,3 +1,5 @@ +using ReC.Application.Common.Exceptions; + namespace ReC.Application.Common.Options.DbModel; public class EntityOptions @@ -7,4 +9,17 @@ public class EntityOptions public string Schema { get; set; } = "dbo"; public Dictionary 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}'."); + } + } } diff --git a/src/ReC.Infrastructure/RecDbContext.cs b/src/ReC.Infrastructure/RecDbContext.cs index 641b0cf..790bdf8 100644 --- a/src/ReC.Infrastructure/RecDbContext.cs +++ b/src/ReC.Infrastructure/RecDbContext.cs @@ -39,47 +39,46 @@ public class RecDbContext(DbContextOptions options, IOptions(b => { b.ToView(opt.Name, opt.Schema); b.HasKey(e => e.Id); - b.Property(e => e.Id).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.Id))); - b.Property(e => e.ProfileId).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.ProfileId))); - b.Property(e => e.ProfileName).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.ProfileName))); - b.Property(e => e.ProfileType).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.ProfileType))); - b.Property(e => e.Sequence).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.Sequence))); - b.Property(e => e.EndpointId).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointId))); - b.Property(e => e.EndpointUri).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointUri))); - b.Property(e => e.EndpointAuthId).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthId))); - b.Property(e => e.EndpointAuthType).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthType))); - b.Property(e => e.EndpointAuthTypeName).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthTypeName))); - b.Property(e => e.EndpointAuthApiKey).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthApiKey))); - b.Property(e => e.EndpointAuthApiValue).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthApiValue))); - b.Property(e => e.EndpointAuthApiKeyAddTo).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthApiKeyAddTo))); - b.Property(e => e.EndpointAuthApiKeyAddToName).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthApiKeyAddToName))); - b.Property(e => e.EndpointAuthToken).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthToken))); - b.Property(e => e.EndpointAuthUsername).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthUsername))); - b.Property(e => e.EndpointAuthPassword).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthPassword))); - b.Property(e => e.EndpointAuthDomain).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthDomain))); - b.Property(e => e.EndpointAuthWorkstation).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointAuthWorkstation))); - b.Property(e => e.EndpointParamsId).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.EndpointParamsId))); - b.Property(e => e.SqlConnectionId).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.SqlConnectionId))); - b.Property(e => e.SqlConnectionServer).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.SqlConnectionServer))); - b.Property(e => e.SqlConnectionDb).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.SqlConnectionDb))); - b.Property(e => e.SqlConnectionUsername).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.SqlConnectionUsername))); - b.Property(e => e.SqlConnectionPassword).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.SqlConnectionPassword))); - b.Property(e => e.RestType).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.RestType))); - b.Property(e => e.RestTypeName).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.RestTypeName))); - b.Property(e => e.PreprocessingQuery).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.PreprocessingQuery))); - b.Property(e => e.HeaderQuery).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.HeaderQuery))); - b.Property(e => e.BodyQuery).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.BodyQuery))); - b.Property(e => e.PostprocessingQuery).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.PostprocessingQuery))); - b.Property(e => e.ErrorAction).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.ErrorAction))); - b.Property(e => e.ErrorActionName).HasColumnName(opt.GetColumn(entityName, nameof(RecActionView.ErrorActionName))); + b.Property(e => e.Id).HasColumnName(opt[nameof(RecActionView.Id)]); + b.Property(e => e.ProfileId).HasColumnName(opt[nameof(RecActionView.ProfileId)]); + b.Property(e => e.ProfileName).HasColumnName(opt[nameof(RecActionView.ProfileName)]); + b.Property(e => e.ProfileType).HasColumnName(opt[nameof(RecActionView.ProfileType)]); + b.Property(e => e.Sequence).HasColumnName(opt[nameof(RecActionView.Sequence)]); + b.Property(e => e.EndpointId).HasColumnName(opt[nameof(RecActionView.EndpointId)]); + b.Property(e => e.EndpointUri).HasColumnName(opt[nameof(RecActionView.EndpointUri)]); + b.Property(e => e.EndpointAuthId).HasColumnName(opt[nameof(RecActionView.EndpointAuthId)]); + b.Property(e => e.EndpointAuthType).HasColumnName(opt[nameof(RecActionView.EndpointAuthType)]); + b.Property(e => e.EndpointAuthTypeName).HasColumnName(opt[nameof(RecActionView.EndpointAuthTypeName)]); + b.Property(e => e.EndpointAuthApiKey).HasColumnName(opt[nameof(RecActionView.EndpointAuthApiKey)]); + b.Property(e => e.EndpointAuthApiValue).HasColumnName(opt[nameof(RecActionView.EndpointAuthApiValue)]); + b.Property(e => e.EndpointAuthApiKeyAddTo).HasColumnName(opt[nameof(RecActionView.EndpointAuthApiKeyAddTo)]); + b.Property(e => e.EndpointAuthApiKeyAddToName).HasColumnName(opt[nameof(RecActionView.EndpointAuthApiKeyAddToName)]); + b.Property(e => e.EndpointAuthToken).HasColumnName(opt[nameof(RecActionView.EndpointAuthToken)]); + b.Property(e => e.EndpointAuthUsername).HasColumnName(opt[nameof(RecActionView.EndpointAuthUsername)]); + b.Property(e => e.EndpointAuthPassword).HasColumnName(opt[nameof(RecActionView.EndpointAuthPassword)]); + b.Property(e => e.EndpointAuthDomain).HasColumnName(opt[nameof(RecActionView.EndpointAuthDomain)]); + b.Property(e => e.EndpointAuthWorkstation).HasColumnName(opt[nameof(RecActionView.EndpointAuthWorkstation)]); + b.Property(e => e.EndpointParamsId).HasColumnName(opt[nameof(RecActionView.EndpointParamsId)]); + b.Property(e => e.SqlConnectionId).HasColumnName(opt[nameof(RecActionView.SqlConnectionId)]); + b.Property(e => e.SqlConnectionServer).HasColumnName(opt[nameof(RecActionView.SqlConnectionServer)]); + b.Property(e => e.SqlConnectionDb).HasColumnName(opt[nameof(RecActionView.SqlConnectionDb)]); + b.Property(e => e.SqlConnectionUsername).HasColumnName(opt[nameof(RecActionView.SqlConnectionUsername)]); + b.Property(e => e.SqlConnectionPassword).HasColumnName(opt[nameof(RecActionView.SqlConnectionPassword)]); + b.Property(e => e.RestType).HasColumnName(opt[nameof(RecActionView.RestType)]); + b.Property(e => e.RestTypeName).HasColumnName(opt[nameof(RecActionView.RestTypeName)]); + b.Property(e => e.PreprocessingQuery).HasColumnName(opt[nameof(RecActionView.PreprocessingQuery)]); + b.Property(e => e.HeaderQuery).HasColumnName(opt[nameof(RecActionView.HeaderQuery)]); + b.Property(e => e.BodyQuery).HasColumnName(opt[nameof(RecActionView.BodyQuery)]); + b.Property(e => e.PostprocessingQuery).HasColumnName(opt[nameof(RecActionView.PostprocessingQuery)]); + b.Property(e => e.ErrorAction).HasColumnName(opt[nameof(RecActionView.ErrorAction)]); + b.Property(e => e.ErrorActionName).HasColumnName(opt[nameof(RecActionView.ErrorActionName)]); b.HasMany(e => e.Results) .WithOne(r => r.Action) @@ -89,61 +88,59 @@ public class RecDbContext(DbContextOptions options, IOptions(b => { b.ToView(opt.Name, opt.Schema); b.HasKey(e => e.Id); - b.Property(e => e.Id).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Id))); - b.Property(e => e.Active).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Active))); - b.Property(e => e.TypeId).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.TypeId))); - b.Property(e => e.Type).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Type))); - b.Property(e => e.Mandantor).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Mandantor))); - b.Property(e => e.ProfileName).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.ProfileName))); - b.Property(e => e.Description).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Description))); - b.Property(e => e.LogLevelId).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.LogLevelId))); - b.Property(e => e.LogLevel).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.LogLevel))); - b.Property(e => e.LanguageId).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.LanguageId))); - b.Property(e => e.Language).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.Language))); - b.Property(e => e.AddedWho).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.AddedWho))); - b.Property(e => e.AddedWhen).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.AddedWhen))); - b.Property(e => e.ChangedWho).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.ChangedWho))); - b.Property(e => e.ChangedWhen).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.ChangedWhen))); - b.Property(e => e.FirstRun).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.FirstRun))); - b.Property(e => e.LastRun).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.LastRun))); - b.Property(e => e.LastResult).HasColumnName(opt.GetColumn(entityName, nameof(ProfileView.LastResult))); + b.Property(e => e.Id).HasColumnName(opt[nameof(ProfileView.Id)]); + b.Property(e => e.Active).HasColumnName(opt[nameof(ProfileView.Active)]); + b.Property(e => e.TypeId).HasColumnName(opt[nameof(ProfileView.TypeId)]); + b.Property(e => e.Type).HasColumnName(opt[nameof(ProfileView.Type)]); + b.Property(e => e.Mandantor).HasColumnName(opt[nameof(ProfileView.Mandantor)]); + b.Property(e => e.ProfileName).HasColumnName(opt[nameof(ProfileView.ProfileName)]); + b.Property(e => e.Description).HasColumnName(opt[nameof(ProfileView.Description)]); + b.Property(e => e.LogLevelId).HasColumnName(opt[nameof(ProfileView.LogLevelId)]); + b.Property(e => e.LogLevel).HasColumnName(opt[nameof(ProfileView.LogLevel)]); + b.Property(e => e.LanguageId).HasColumnName(opt[nameof(ProfileView.LanguageId)]); + b.Property(e => e.Language).HasColumnName(opt[nameof(ProfileView.Language)]); + b.Property(e => e.AddedWho).HasColumnName(opt[nameof(ProfileView.AddedWho)]); + b.Property(e => e.AddedWhen).HasColumnName(opt[nameof(ProfileView.AddedWhen)]); + b.Property(e => e.ChangedWho).HasColumnName(opt[nameof(ProfileView.ChangedWho)]); + b.Property(e => e.ChangedWhen).HasColumnName(opt[nameof(ProfileView.ChangedWhen)]); + b.Property(e => e.FirstRun).HasColumnName(opt[nameof(ProfileView.FirstRun)]); + b.Property(e => e.LastRun).HasColumnName(opt[nameof(ProfileView.LastRun)]); + b.Property(e => e.LastResult).HasColumnName(opt[nameof(ProfileView.LastResult)]); }); } private void ConfigureResultView(ModelBuilder modelBuilder) { - const string entityName = nameof(ResultView); - var opt = _dbModelOptions.GetEntity(entityName); + var opt = _dbModelOptions[nameof(ResultView)]; modelBuilder.Entity(b => { b.ToView(opt.Name, opt.Schema); b.HasKey(e => e.Id); - b.Property(e => e.Id).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Id))); - b.Property(e => e.ActionId).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.ActionId))); - b.Property(e => e.ProfileId).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.ProfileId))); - b.Property(e => e.ProfileName).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.ProfileName))); - b.Property(e => e.StatusCode).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.StatusCode))); - b.Property(e => e.StatusName).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.StatusName))); - b.Property(e => e.Type).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Type))); - b.Property(e => e.TypeName).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.TypeName))); - b.Property(e => e.Header).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Header))); - b.Property(e => e.Body).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Body))); - b.Property(e => e.Info).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Info))); - b.Property(e => e.Error).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.Error))); - b.Property(e => e.AddedWho).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.AddedWho))); - b.Property(e => e.AddedWhen).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.AddedWhen))); - b.Property(e => e.ChangedWho).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.ChangedWho))); - b.Property(e => e.ChangedWhen).HasColumnName(opt.GetColumn(entityName, nameof(ResultView.ChangedWhen))); + b.Property(e => e.Id).HasColumnName(opt[nameof(ResultView.Id)]); + b.Property(e => e.ActionId).HasColumnName(opt[nameof(ResultView.ActionId)]); + b.Property(e => e.ProfileId).HasColumnName(opt[nameof(ResultView.ProfileId)]); + b.Property(e => e.ProfileName).HasColumnName(opt[nameof(ResultView.ProfileName)]); + b.Property(e => e.StatusCode).HasColumnName(opt[nameof(ResultView.StatusCode)]); + b.Property(e => e.StatusName).HasColumnName(opt[nameof(ResultView.StatusName)]); + b.Property(e => e.Type).HasColumnName(opt[nameof(ResultView.Type)]); + b.Property(e => e.TypeName).HasColumnName(opt[nameof(ResultView.TypeName)]); + b.Property(e => e.Header).HasColumnName(opt[nameof(ResultView.Header)]); + b.Property(e => e.Body).HasColumnName(opt[nameof(ResultView.Body)]); + b.Property(e => e.Info).HasColumnName(opt[nameof(ResultView.Info)]); + b.Property(e => e.Error).HasColumnName(opt[nameof(ResultView.Error)]); + b.Property(e => e.AddedWho).HasColumnName(opt[nameof(ResultView.AddedWho)]); + b.Property(e => e.AddedWhen).HasColumnName(opt[nameof(ResultView.AddedWhen)]); + b.Property(e => e.ChangedWho).HasColumnName(opt[nameof(ResultView.ChangedWho)]); + b.Property(e => e.ChangedWhen).HasColumnName(opt[nameof(ResultView.ChangedWhen)]); b.HasOne(r => r.Action) .WithMany(a => a.Results) @@ -157,37 +154,34 @@ public class RecDbContext(DbContextOptions options, IOptions(b => { 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) { - const string entityName = nameof(BodyQueryResult); - var opt = _dbModelOptions.GetEntity(entityName); + var opt = _dbModelOptions[nameof(BodyQueryResult)]; modelBuilder.Entity(b => { 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) { - const string entityName = nameof(InsertObjectResult); - var opt = _dbModelOptions.GetEntity(entityName); + var opt = _dbModelOptions[nameof(InsertObjectResult)]; modelBuilder.Entity(b => { b.HasNoKey(); - b.Property(e => e.NewObjectId).HasColumnName(opt.GetColumn(entityName, nameof(InsertObjectResult.NewObjectId))); + b.Property(e => e.NewObjectId).HasColumnName(opt[nameof(InsertObjectResult.NewObjectId)]); }); } } \ No newline at end of file