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:
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
19
DbFirst.Infrastructure/TableConfigurations.cs
Normal file
19
DbFirst.Infrastructure/TableConfigurations.cs
Normal 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";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user