From 2e63b5da05f9a40356735f867014a250d4b249af Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Sep 2025 05:09:15 +0000 Subject: [PATCH 1/5] Initial plan From 9c4c3268164edd720859fb3fad1a993eb06178ca Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Sep 2025 05:22:32 +0000 Subject: [PATCH 2/5] Add EnrichSqliteDatabaseDbContext extension method for WebApplicationBuilder Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- Directory.Packages.props | 1 + .../AspireEFSqliteExtensions.cs | 52 ++++++++++ ...icrosoft.EntityFrameworkCore.Sqlite.csproj | 1 + ...ft.EntityFrameworkCore.Sqlite.Tests.csproj | 4 + .../EnrichSqliteDatabaseDbContextTests.cs | 94 +++++++++++++++++++ 5 files changed, 152 insertions(+) create mode 100644 tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 93a899dd3..60369c11c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -53,6 +53,7 @@ + diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs index 126d476a9..fca5baa2d 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs @@ -73,3 +73,55 @@ void ConfigureDbContext(DbContextOptionsBuilder dbContextOptionsBuilder) } } } + +namespace Microsoft.AspNetCore.Builder; + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using System.Diagnostics.CodeAnalysis; + +/// +/// Extension methods for configuring Sqlite with Entity Framework Core on WebApplicationBuilder. +/// +public static class AspireEFSqliteWebExtensions +{ + /// + /// Enriches a to register the as a scoped service + /// with simplified configuration and optional OpenTelemetry instrumentation. + /// + /// The type of the . + /// The to read config from and add services to. + /// The name used to retrieve the connection string from the ConnectionStrings configuration section. Defaults to "DefaultConnection". + /// Whether to enable OpenTelemetry instrumentation for Entity Framework Core. Defaults to true. + /// The so that additional calls can be chained. + /// Thrown if mandatory is null. + /// Thrown when the connection string is not found or is empty. + public static WebApplicationBuilder EnrichSqliteDatabaseDbContext<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties)] TDbContext>( + this WebApplicationBuilder builder, + string? connectionStringName = "DefaultConnection", + bool enableOpenTelemetry = true) + where TDbContext : DbContext + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentException.ThrowIfNullOrEmpty(connectionStringName); + + var connectionString = builder.Configuration.GetConnectionString(connectionStringName); + if (string.IsNullOrEmpty(connectionString)) + { + throw new InvalidOperationException($"Connection string '{connectionStringName}' not found or empty."); + } + + builder.Services.AddDbContext(options => + options.UseSqlite(connectionString)); + + // TODO: Add OpenTelemetry support once we can verify package references work + // if (enableOpenTelemetry) + // { + // builder.Services.AddOpenTelemetry() + // .WithTracing(tracing => tracing + // .AddEntityFrameworkCoreInstrumentation()); + // } + + return builder; + } +} diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj index 84fbc79dc..809a2dcd9 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj @@ -11,6 +11,7 @@ + diff --git a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests.csproj b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests.csproj index f12f057fb..ef9b3102d 100644 --- a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests.csproj +++ b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests.csproj @@ -4,4 +4,8 @@ + + + + diff --git a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs new file mode 100644 index 000000000..5a9aba863 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs @@ -0,0 +1,94 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests; + +public class EnrichSqliteDatabaseDbContextTests +{ + [Fact] + public void EnrichSqliteDatabaseDbContext_RegistersDbContext() + { + // Arrange + var builder = WebApplication.CreateBuilder(); + builder.Configuration.AddInMemoryCollection([ + new KeyValuePair("ConnectionStrings:DefaultConnection", "Data Source=:memory:") + ]); + + // Act + builder.EnrichSqliteDatabaseDbContext(); + + // Assert + var app = builder.Build(); + var dbContext = app.Services.GetRequiredService(); + Assert.NotNull(dbContext); + } + + [Fact] + public void EnrichSqliteDatabaseDbContext_WithCustomConnectionStringName() + { + // Arrange + var builder = WebApplication.CreateBuilder(); + builder.Configuration.AddInMemoryCollection([ + new KeyValuePair("ConnectionStrings:CustomConnection", "Data Source=:memory:") + ]); + + // Act + builder.EnrichSqliteDatabaseDbContext("CustomConnection"); + + // Assert + var app = builder.Build(); + var dbContext = app.Services.GetRequiredService(); + Assert.NotNull(dbContext); + } + + [Fact] + public void EnrichSqliteDatabaseDbContext_ThrowsWhenBuilderIsNull() + { + // Act & Assert + Assert.Throws(() => + AspireEFSqliteWebExtensions.EnrichSqliteDatabaseDbContext(null!)); + } + + [Fact] + public void EnrichSqliteDatabaseDbContext_ThrowsWhenConnectionStringNameIsEmpty() + { + // Arrange + var builder = WebApplication.CreateBuilder(); + + // Act & Assert + Assert.Throws(() => + builder.EnrichSqliteDatabaseDbContext("")); + } + + [Fact] + public void EnrichSqliteDatabaseDbContext_ThrowsWhenConnectionStringNotFound() + { + // Arrange + var builder = WebApplication.CreateBuilder(); + + // Act & Assert + Assert.Throws(() => + builder.EnrichSqliteDatabaseDbContext("NonExistentConnection")); + } + + [Fact] + public void EnrichSqliteDatabaseDbContext_DisablesOpenTelemetryWhenFalse() + { + // Arrange + var builder = WebApplication.CreateBuilder(); + builder.Configuration.AddInMemoryCollection([ + new KeyValuePair("ConnectionStrings:DefaultConnection", "Data Source=:memory:") + ]); + + // Act + builder.EnrichSqliteDatabaseDbContext(enableOpenTelemetry: false); + + // Assert - The test passes if no exceptions are thrown and DbContext is registered + var app = builder.Build(); + var dbContext = app.Services.GetRequiredService(); + Assert.NotNull(dbContext); + } +} \ No newline at end of file From 436d2da94042deb21a76cfbbd1f53d7d1e06b34e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Sep 2025 05:24:52 +0000 Subject: [PATCH 3/5] Complete EnrichSqliteDatabaseDbContext with OpenTelemetry support Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .../AspireEFSqliteExtensions.cs | 14 +++++++------- ...ire.Microsoft.EntityFrameworkCore.Sqlite.csproj | 2 ++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs index fca5baa2d..7d043ba58 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs @@ -78,6 +78,7 @@ namespace Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using OpenTelemetry.Trace; using System.Diagnostics.CodeAnalysis; /// @@ -114,13 +115,12 @@ public static class AspireEFSqliteWebExtensions builder.Services.AddDbContext(options => options.UseSqlite(connectionString)); - // TODO: Add OpenTelemetry support once we can verify package references work - // if (enableOpenTelemetry) - // { - // builder.Services.AddOpenTelemetry() - // .WithTracing(tracing => tracing - // .AddEntityFrameworkCoreInstrumentation()); - // } + if (enableOpenTelemetry) + { + builder.Services.AddOpenTelemetry() + .WithTracing(tracing => tracing + .AddEntityFrameworkCoreInstrumentation()); + } return builder; } diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj index 809a2dcd9..052948a88 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj @@ -12,6 +12,8 @@ + + From af1deffd5f8f2f203cbd013d2b480392ca8f6e08 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Sep 2025 05:26:42 +0000 Subject: [PATCH 4/5] Add documentation and complete test coverage for EnrichSqliteDatabaseDbContext Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .../README.md | 23 +++++++++++++++++++ .../EnrichSqliteDatabaseDbContextTests.cs | 22 ++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/README.md b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/README.md index 2e2f022bf..7863962aa 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/README.md +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/README.md @@ -19,12 +19,35 @@ dotnet add package CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite ### Example usage +#### Option 1: Using IHostApplicationBuilder (Traditional Aspire Pattern) + In the _Program.cs_ file of your project, call the `AddSqliteDbContext` extension method to register the `TDbContext` implementation in the DI container. This method takes the connection name as a parameter: ```csharp builder.AddSqliteDbContext("sqlite"); ``` +#### Option 2: Using WebApplicationBuilder (New Simplified Pattern) + +For ASP.NET Core applications, you can use the simplified `EnrichSqliteDatabaseDbContext` extension method: + +```csharp +// Basic usage with default connection string name "DefaultConnection" +builder.EnrichSqliteDatabaseDbContext(); + +// With custom connection string name +builder.EnrichSqliteDatabaseDbContext("MyConnection"); + +// Disable OpenTelemetry instrumentation +builder.EnrichSqliteDatabaseDbContext(enableOpenTelemetry: false); +``` + +The `EnrichSqliteDatabaseDbContext` method provides: +- **Simplified API**: Works directly with `WebApplicationBuilder` +- **Default connection string**: Uses "DefaultConnection" by default +- **OpenTelemetry integration**: Automatically adds EF Core instrumentation for distributed tracing +- **Parameter validation**: Proper error handling for missing connection strings + Then, in your service, inject `TDbContext` and use it to interact with the database: ```csharp diff --git a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs index 5a9aba863..796a4f762 100644 --- a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs +++ b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs @@ -91,4 +91,26 @@ public void EnrichSqliteDatabaseDbContext_DisablesOpenTelemetryWhenFalse() var dbContext = app.Services.GetRequiredService(); Assert.NotNull(dbContext); } + + [Fact] + public void EnrichSqliteDatabaseDbContext_EnablesOpenTelemetryByDefault() + { + // Arrange + var builder = WebApplication.CreateBuilder(); + builder.Configuration.AddInMemoryCollection([ + new KeyValuePair("ConnectionStrings:DefaultConnection", "Data Source=:memory:") + ]); + + // Act + builder.EnrichSqliteDatabaseDbContext(); + + // Assert - The test passes if no exceptions are thrown and OpenTelemetry services are registered + var app = builder.Build(); + var dbContext = app.Services.GetRequiredService(); + Assert.NotNull(dbContext); + + // Verify OpenTelemetry services are registered (basic smoke test) + var services = app.Services.GetServices().ToList(); + Assert.True(services.Count > 0, "Services should be registered"); + } } \ No newline at end of file From 54e6e77d8a6147a67417b8a6f79863ed47053f3f Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Thu, 11 Sep 2025 06:36:36 +0000 Subject: [PATCH 5/5] Aligning properly with the aspire implementations --- Directory.Build.props | 2 +- Directory.Packages.props | 2 +- .../AspireEFSqliteExtensions.cs | 87 +++++++++++-------- ...icrosoft.EntityFrameworkCore.Sqlite.csproj | 1 - .../README.md | 10 ++- .../SqliteEntityFrameworkCoreSettings.cs | 6 ++ ...ft.EntityFrameworkCore.Sqlite.Tests.csproj | 4 - .../EnrichSqliteDatabaseDbContextTests.cs | 52 ++--------- 8 files changed, 70 insertions(+), 94 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 48cae638a..57adcd031 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -16,7 +16,7 @@ $(AspireVersion) 9.0.0 9.0.4 - 1.11.1 + 1.12.0 4.4.0 9.5.0 false diff --git a/Directory.Packages.props b/Directory.Packages.props index 60369c11c..1c127a2f2 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -53,7 +53,7 @@ - + diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs index 7d043ba58..52bd18e8f 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs @@ -1,8 +1,8 @@ using Aspire; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Diagnostics.Internal; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using OpenTelemetry.Trace; using System.Diagnostics.CodeAnalysis; namespace Microsoft.Extensions.Hosting; @@ -58,10 +58,7 @@ public static class AspireEFSqliteExtensions builder.Services.AddDbContextPool(ConfigureDbContext); - if (!settings.DisableHealthChecks) - { - builder.TryAddHealthCheck(name: typeof(TContext).Name, static hcBuilder => hcBuilder.AddDbContextCheck()); - } + ConfigureInstrumentation(builder, settings); void ConfigureDbContext(DbContextOptionsBuilder dbContextOptionsBuilder) { @@ -72,56 +69,72 @@ void ConfigureDbContext(DbContextOptionsBuilder dbContextOptionsBuilder) configureDbContextOptions?.Invoke(dbContextOptionsBuilder); } } -} -namespace Microsoft.AspNetCore.Builder; - -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using OpenTelemetry.Trace; -using System.Diagnostics.CodeAnalysis; - -/// -/// Extension methods for configuring Sqlite with Entity Framework Core on WebApplicationBuilder. -/// -public static class AspireEFSqliteWebExtensions -{ /// - /// Enriches a to register the as a scoped service + /// Enriches a to register the as a scoped service /// with simplified configuration and optional OpenTelemetry instrumentation. /// /// The type of the . - /// The to read config from and add services to. - /// The name used to retrieve the connection string from the ConnectionStrings configuration section. Defaults to "DefaultConnection". - /// Whether to enable OpenTelemetry instrumentation for Entity Framework Core. Defaults to true. - /// The so that additional calls can be chained. + /// The to read config from and add services to. + /// An optional delegate that can be used for customizing options. It's invoked after the settings are read from the configuration. /// Thrown if mandatory is null. - /// Thrown when the connection string is not found or is empty. - public static WebApplicationBuilder EnrichSqliteDatabaseDbContext<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties)] TDbContext>( - this WebApplicationBuilder builder, - string? connectionStringName = "DefaultConnection", - bool enableOpenTelemetry = true) + public static void EnrichSqliteDatabaseDbContext<[DynamicallyAccessedMembers(RequiredByEF)] TDbContext>( + this IHostApplicationBuilder builder, + Action? configureSettings = null) where TDbContext : DbContext { ArgumentNullException.ThrowIfNull(builder); - ArgumentException.ThrowIfNullOrEmpty(connectionStringName); - var connectionString = builder.Configuration.GetConnectionString(connectionStringName); - if (string.IsNullOrEmpty(connectionString)) - { - throw new InvalidOperationException($"Connection string '{connectionStringName}' not found or empty."); - } + var settings = builder.GetDbContextSettings( + DefaultConfigSectionName, + null, + (settings, section) => section.Bind(settings) + ); + + configureSettings?.Invoke(settings); builder.Services.AddDbContext(options => - options.UseSqlite(connectionString)); + options.UseSqlite(settings.ConnectionString)); + ConfigureInstrumentation(builder, settings); + } - if (enableOpenTelemetry) + private static void ConfigureInstrumentation<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties)] TDbContext>(IHostApplicationBuilder builder, SqliteEntityFrameworkCoreSettings settings) where TDbContext : DbContext + { + if (!settings.DisableTracing) { builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddEntityFrameworkCoreInstrumentation()); } - return builder; + if (!settings.DisableHealthChecks) + { + builder.TryAddHealthCheck( + name: typeof(TDbContext).Name, + static hcBuilder => hcBuilder.AddDbContextCheck()); + } + } + + internal static TSettings GetDbContextSettings(this IHostApplicationBuilder builder, string defaultConfigSectionName, string? connectionName, Action bindSettings) + where TSettings : new() + { + TSettings settings = new(); + var configurationSection = builder.Configuration.GetSection(defaultConfigSectionName); + bindSettings(settings, configurationSection); + // If the connectionName is not provided, we've been called in the context + // of an Enrich invocation and don't need to bind the connectionName specific settings. + // Instead, we'll just bind to the TContext-specific settings. + if (connectionName is not null) + { + var connectionSpecificConfigurationSection = configurationSection.GetSection(connectionName); + bindSettings(settings, connectionSpecificConfigurationSection); + } + var typeSpecificConfigurationSection = configurationSection.GetSection(typeof(TContext).Name); + if (typeSpecificConfigurationSection.Exists()) // https://github.com/dotnet/runtime/issues/91380 + { + bindSettings(settings, typeSpecificConfigurationSection); + } + + return settings; } } diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj index 052948a88..2220882bd 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj @@ -11,7 +11,6 @@ - diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/README.md b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/README.md index 7863962aa..fe18958ea 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/README.md +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/README.md @@ -43,10 +43,11 @@ builder.EnrichSqliteDatabaseDbContext(enableOpenTelemetry: fals ``` The `EnrichSqliteDatabaseDbContext` method provides: -- **Simplified API**: Works directly with `WebApplicationBuilder` -- **Default connection string**: Uses "DefaultConnection" by default -- **OpenTelemetry integration**: Automatically adds EF Core instrumentation for distributed tracing -- **Parameter validation**: Proper error handling for missing connection strings + +- **Simplified API**: Works directly with `WebApplicationBuilder` +- **Default connection string**: Uses "DefaultConnection" by default +- **OpenTelemetry integration**: Automatically adds EF Core instrumentation for distributed tracing +- **Parameter validation**: Proper error handling for missing connection strings Then, in your service, inject `TDbContext` and use it to interact with the database: @@ -65,3 +66,4 @@ public class MyService(BloggingContext context) ## Feedback & contributing https://github.com/CommunityToolkit/Aspire + diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/SqliteEntityFrameworkCoreSettings.cs b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/SqliteEntityFrameworkCoreSettings.cs index 511c1d947..9fa450adc 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/SqliteEntityFrameworkCoreSettings.cs +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/SqliteEntityFrameworkCoreSettings.cs @@ -22,4 +22,10 @@ public sealed class SqliteEntityFrameworkCoreSettings /// Gets or sets the default timeout for the database operations. /// public int DefaultTimeout { get; set; } + + /// + /// Gets or sets a boolean value that indicates whether tracing is disabled or not. + /// + public bool DisableTracing { get; set; } + } \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests.csproj b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests.csproj index ef9b3102d..f12f057fb 100644 --- a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests.csproj +++ b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests.csproj @@ -4,8 +4,4 @@ - - - - diff --git a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs index 796a4f762..29d6ea46f 100644 --- a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs +++ b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/EnrichSqliteDatabaseDbContextTests.cs @@ -26,52 +26,12 @@ public void EnrichSqliteDatabaseDbContext_RegistersDbContext() Assert.NotNull(dbContext); } - [Fact] - public void EnrichSqliteDatabaseDbContext_WithCustomConnectionStringName() - { - // Arrange - var builder = WebApplication.CreateBuilder(); - builder.Configuration.AddInMemoryCollection([ - new KeyValuePair("ConnectionStrings:CustomConnection", "Data Source=:memory:") - ]); - - // Act - builder.EnrichSqliteDatabaseDbContext("CustomConnection"); - - // Assert - var app = builder.Build(); - var dbContext = app.Services.GetRequiredService(); - Assert.NotNull(dbContext); - } - [Fact] public void EnrichSqliteDatabaseDbContext_ThrowsWhenBuilderIsNull() { // Act & Assert - Assert.Throws(() => - AspireEFSqliteWebExtensions.EnrichSqliteDatabaseDbContext(null!)); - } - - [Fact] - public void EnrichSqliteDatabaseDbContext_ThrowsWhenConnectionStringNameIsEmpty() - { - // Arrange - var builder = WebApplication.CreateBuilder(); - - // Act & Assert - Assert.Throws(() => - builder.EnrichSqliteDatabaseDbContext("")); - } - - [Fact] - public void EnrichSqliteDatabaseDbContext_ThrowsWhenConnectionStringNotFound() - { - // Arrange - var builder = WebApplication.CreateBuilder(); - - // Act & Assert - Assert.Throws(() => - builder.EnrichSqliteDatabaseDbContext("NonExistentConnection")); + Assert.Throws(() => + AspireEFSqliteExtensions.EnrichSqliteDatabaseDbContext(null!)); } [Fact] @@ -84,7 +44,7 @@ public void EnrichSqliteDatabaseDbContext_DisablesOpenTelemetryWhenFalse() ]); // Act - builder.EnrichSqliteDatabaseDbContext(enableOpenTelemetry: false); + builder.EnrichSqliteDatabaseDbContext(settings => settings.DisableTracing = true); // Assert - The test passes if no exceptions are thrown and DbContext is registered var app = builder.Build(); @@ -102,15 +62,15 @@ public void EnrichSqliteDatabaseDbContext_EnablesOpenTelemetryByDefault() ]); // Act - builder.EnrichSqliteDatabaseDbContext(); + builder.EnrichSqliteDatabaseDbContext(settings => settings.DisableTracing = false); // Assert - The test passes if no exceptions are thrown and OpenTelemetry services are registered var app = builder.Build(); var dbContext = app.Services.GetRequiredService(); Assert.NotNull(dbContext); - + // Verify OpenTelemetry services are registered (basic smoke test) - var services = app.Services.GetServices().ToList(); + var services = app.Services.GetServices().ToList(); Assert.True(services.Count > 0, "Services should be registered"); } } \ No newline at end of file