From b7848d71d62d8a0676abc2678cd7967dc902071d Mon Sep 17 00:00:00 2001 From: Rhys Ickeringill Date: Sun, 28 Dec 2025 16:19:33 +1100 Subject: [PATCH] Don't use PooledDbContextFactory when initially loading config --- .../README.md | 4 +++- .../README.md | 4 +++- .../EntityFrameworkCoreDbSetConfigurationProvider.cs | 9 +++++---- .../Extensions/ConfigurationBuilderExtensions.cs | 7 +++---- .../ISettingsDbContext.cs | 6 ++++++ .../README.md | 4 +++- 6 files changed, 23 insertions(+), 11 deletions(-) diff --git a/RAIC.Extensions.Configuration.EntityFrameworkCore.PostgreSQL/README.md b/RAIC.Extensions.Configuration.EntityFrameworkCore.PostgreSQL/README.md index 1381380..ff2bd8d 100644 --- a/RAIC.Extensions.Configuration.EntityFrameworkCore.PostgreSQL/README.md +++ b/RAIC.Extensions.Configuration.EntityFrameworkCore.PostgreSQL/README.md @@ -84,9 +84,11 @@ public record Setting : ISetting public required string Value { get; set; } } -public class MyDbContext(DbContextOptions options) : DbContext(options), ISettingsDbContext, Setting> +public class MyDbContext(DbContextOptions options) : DbContext(options), ISettingsDbContext, Setting>, ISettingsDbContextFactory { public DbSet Settings { get; set; } + + public static MyDbContext Create(DbContextOptions options) => new(options); } diff --git a/RAIC.Extensions.Configuration.EntityFrameworkCore.SqlServer/README.md b/RAIC.Extensions.Configuration.EntityFrameworkCore.SqlServer/README.md index 22971cd..1dda7ac 100644 --- a/RAIC.Extensions.Configuration.EntityFrameworkCore.SqlServer/README.md +++ b/RAIC.Extensions.Configuration.EntityFrameworkCore.SqlServer/README.md @@ -57,9 +57,11 @@ public record Setting : ISetting public required string Value { get; set; } } -public class MyDbContext(DbContextOptions options) : DbContext(options), ISettingsDbContext,Setting> +public class MyDbContext(DbContextOptions options) : DbContext(options), ISettingsDbContext, Setting>, ISettingsDbContextFactory { public DbSet Settings { get; set; } + + public static MyDbContext Create(DbContextOptions options) => new(options); } diff --git a/RAIC.Extensions.Configuration.EntityFrameworkCore/EntityFrameworkCoreDbSetConfigurationProvider.cs b/RAIC.Extensions.Configuration.EntityFrameworkCore/EntityFrameworkCoreDbSetConfigurationProvider.cs index 0383077..3d69704 100644 --- a/RAIC.Extensions.Configuration.EntityFrameworkCore/EntityFrameworkCoreDbSetConfigurationProvider.cs +++ b/RAIC.Extensions.Configuration.EntityFrameworkCore/EntityFrameworkCoreDbSetConfigurationProvider.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; @@ -26,7 +27,7 @@ internal class EntityFrameworkCoreDbSetConfigurationProvider s.Key, s => (string?)s.Value); } @@ -37,14 +38,14 @@ internal class EntityFrameworkCoreDbSetConfigurationProvider where TDbContext : DbContext { - internal IDbContextFactory DbContextFactory { get; } + internal Func DbContextFactory { get; } } internal class EntityFrameworkCoreDbSetConfigurationSource : IConfigurationSource, IEntityFrameworkCoreDbSetConfigurationSource where TDbContext : DbContext, ISettingsDbContext, TSetting> where TSetting : class, ISetting { - public required IDbContextFactory DbContextFactory { get; init; } + public required Func DbContextFactory { get; init; } public IConfigurationProvider Build(IConfigurationBuilder builder) { diff --git a/RAIC.Extensions.Configuration.EntityFrameworkCore/Extensions/ConfigurationBuilderExtensions.cs b/RAIC.Extensions.Configuration.EntityFrameworkCore/Extensions/ConfigurationBuilderExtensions.cs index 61a37d4..e558d51 100644 --- a/RAIC.Extensions.Configuration.EntityFrameworkCore/Extensions/ConfigurationBuilderExtensions.cs +++ b/RAIC.Extensions.Configuration.EntityFrameworkCore/Extensions/ConfigurationBuilderExtensions.cs @@ -1,5 +1,4 @@ using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.Extensions.Configuration; namespace RAIC.Extensions.Configuration.EntityFrameworkCore.Extensions; @@ -21,13 +20,13 @@ public static class ConfigurationBuilderExtensions /// /// The public static IConfigurationBuilder AddDbSet(this IConfigurationBuilder builder, DbContextOptionsTransformer optionsTransformer) - where TDbContext : DbContext, ISettingsDbContext, TSetting> + where TDbContext : DbContext, ISettingsDbContext, TSetting>, ISettingsDbContextFactory where TSetting : class, ISetting { - // DEBT: Find way to create non-pooled DbContextFactory since this is only a short lived usage + var options = optionsTransformer(new DbContextOptionsBuilder()).Options; var configurationSource = new EntityFrameworkCoreDbSetConfigurationSource() { - DbContextFactory = new PooledDbContextFactory(optionsTransformer(new DbContextOptionsBuilder()).Options, poolSize: 1) + DbContextFactory = () => TDbContext.Create(options) }; return builder.Add(configurationSource); diff --git a/RAIC.Extensions.Configuration.EntityFrameworkCore/ISettingsDbContext.cs b/RAIC.Extensions.Configuration.EntityFrameworkCore/ISettingsDbContext.cs index fbf1a70..c5c6752 100644 --- a/RAIC.Extensions.Configuration.EntityFrameworkCore/ISettingsDbContext.cs +++ b/RAIC.Extensions.Configuration.EntityFrameworkCore/ISettingsDbContext.cs @@ -11,6 +11,12 @@ public interface ISettingsDbContext : IDisposab TSettingDbSet Settings { get; } } +public interface ISettingsDbContextFactory + where TDbContext : DbContext +{ + static abstract TDbContext Create(DbContextOptions options); +} + public interface ISetting { diff --git a/RAIC.Extensions.Configuration.EntityFrameworkCore/README.md b/RAIC.Extensions.Configuration.EntityFrameworkCore/README.md index b3be4e0..bbd12a1 100644 --- a/RAIC.Extensions.Configuration.EntityFrameworkCore/README.md +++ b/RAIC.Extensions.Configuration.EntityFrameworkCore/README.md @@ -33,9 +33,11 @@ public record Setting : ISetting public required string Value { get; set; } } -public class MyDbContext(DbContextOptions options) : DbContext(options), ISettingsDbContext, Setting> +public class MyDbContext(DbContextOptions options) : DbContext(options), ISettingsDbContext, Setting>, ISettingsDbContextFactory { public DbSet Settings { get; set; } + + public static MyDbContext Create(DbContextOptions options) => new(options); } var builder = Host.CreateApplicationBuilder(args) // or WebApplication.CreateBuilder(args);