From 44ed3f2f12e3a1e38fc851c92bd9817a3c7615cf Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Sat, 17 Feb 2024 20:32:29 +0200 Subject: [PATCH] Don't use NpgsqlDataSource from DI if connection string/connection is specified (#3102) Fixes #3060 (cherry picked from commit c0c962c8b2aa76c7e614806153e5c9e9bbb6c253) --- .../Internal/NpgsqlSingletonOptions.cs | 4 +++- .../NpgsqlRelationalConnectionTest.cs | 22 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/EFCore.PG/Internal/NpgsqlSingletonOptions.cs b/src/EFCore.PG/Internal/NpgsqlSingletonOptions.cs index 81785d0bf..e50b78bdb 100644 --- a/src/EFCore.PG/Internal/NpgsqlSingletonOptions.cs +++ b/src/EFCore.PG/Internal/NpgsqlSingletonOptions.cs @@ -89,7 +89,9 @@ public virtual void Initialize(IDbContextOptions options) // TODO: Remove after https://github.com/dotnet/efcore/pull/29950 ApplicationServiceProvider = coreOptions.ApplicationServiceProvider; - DataSource = npgsqlOptions.DataSource ?? coreOptions.ApplicationServiceProvider?.GetService(); + DataSource = npgsqlOptions.DataSource ?? (npgsqlOptions.ConnectionString is null && npgsqlOptions.Connection is null + ? coreOptions.ApplicationServiceProvider?.GetService() + : null); } /// diff --git a/test/EFCore.PG.Tests/NpgsqlRelationalConnectionTest.cs b/test/EFCore.PG.Tests/NpgsqlRelationalConnectionTest.cs index 8d152daed..7f6421338 100644 --- a/test/EFCore.PG.Tests/NpgsqlRelationalConnectionTest.cs +++ b/test/EFCore.PG.Tests/NpgsqlRelationalConnectionTest.cs @@ -51,7 +51,7 @@ public void Uses_DbDataSource_from_DbContextOptions() Assert.Equal("Host=FakeHost", connection2.ConnectionString); } - [Fact] + [Fact(Skip = "Passes in isolation, but fails when the entire test suite is run because of #2891")] public void Uses_DbDataSource_from_application_service_provider() { var serviceCollection = new ServiceCollection(); @@ -81,6 +81,26 @@ public void Uses_DbDataSource_from_application_service_provider() Assert.Equal("Host=FakeHost", connection2.ConnectionString); } + [Fact] // #3060 + public void DbDataSource_from_application_service_provider_does_not_used_if_connection_string_is_specified() + { + var serviceCollection = new ServiceCollection(); + + serviceCollection + .AddNpgsqlDataSource("Host=FakeHost1") + .AddDbContext(o => o.UseNpgsql("Host=FakeHost2")); + + using var serviceProvider = serviceCollection.BuildServiceProvider(); + + using var scope1 = serviceProvider.CreateScope(); + var context1 = scope1.ServiceProvider.GetRequiredService(); + var relationalConnection1 = (NpgsqlRelationalConnection)context1.GetService()!; + Assert.Null(relationalConnection1.DbDataSource); + + var connection1 = context1.GetService().Database.GetDbConnection(); + Assert.Equal("Host=FakeHost2", connection1.ConnectionString); + } + [Fact] public void Can_create_master_connection_with_connection_string() {