From ae017002d657f067dd8c1a017ab8cb252b4d8d99 Mon Sep 17 00:00:00 2001 From: Laurents Meyer Date: Thu, 25 Apr 2024 14:16:26 +0200 Subject: [PATCH] Fix regression bug to allow usage of named connection strings again. --- src/EFCore.MySql/Internal/MySqlOptions.cs | 11 ++-- .../MySqlRelationalConnectionTest.cs | 51 +++++++++++++------ 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/EFCore.MySql/Internal/MySqlOptions.cs b/src/EFCore.MySql/Internal/MySqlOptions.cs index 54db5ca3..b19ca4b0 100644 --- a/src/EFCore.MySql/Internal/MySqlOptions.cs +++ b/src/EFCore.MySql/Internal/MySqlOptions.cs @@ -10,6 +10,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Pomelo.EntityFrameworkCore.MySql.Infrastructure; using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.Extensions.DependencyInjection; using MySqlConnector; @@ -57,7 +58,7 @@ public virtual void Initialize(IDbContextOptions options) var mySqlOptions = options.FindExtension() ?? new MySqlOptionsExtension(); var mySqlJsonOptions = (MySqlJsonOptionsExtension)options.Extensions.LastOrDefault(e => e is MySqlJsonOptionsExtension); - ConnectionSettings = GetConnectionSettings(mySqlOptions); + ConnectionSettings = GetConnectionSettings(mySqlOptions, options); DataSource = mySqlOptions.DataSource; ServerVersion = mySqlOptions.ServerVersion ?? throw new InvalidOperationException($"The {nameof(ServerVersion)} has not been set."); NoBackslashEscapes = mySqlOptions.NoBackslashEscapes; @@ -77,7 +78,7 @@ public virtual void Validate(IDbContextOptions options) { var mySqlOptions = options.FindExtension() ?? new MySqlOptionsExtension(); var mySqlJsonOptions = (MySqlJsonOptionsExtension)options.Extensions.LastOrDefault(e => e is MySqlJsonOptionsExtension); - var connectionSettings = GetConnectionSettings(mySqlOptions); + var connectionSettings = GetConnectionSettings(mySqlOptions, options); // // CHECK: To we have to ensure that the ApplicationServiceProvider itself is not replaced, because we rely on it in our @@ -247,10 +248,12 @@ protected virtual MySqlDefaultDataTypeMappings ApplyDefaultDataTypeMappings(MySq return defaultDataTypeMappings; } - private static MySqlConnectionSettings GetConnectionSettings(MySqlOptionsExtension relationalOptions) + private static MySqlConnectionSettings GetConnectionSettings(MySqlOptionsExtension relationalOptions, IDbContextOptions options) => relationalOptions.Connection != null ? new MySqlConnectionSettings(relationalOptions.Connection) - : new MySqlConnectionSettings(relationalOptions.ConnectionString); + : new MySqlConnectionSettings( + new NamedConnectionStringResolver(options) + .ResolveConnectionString(relationalOptions.ConnectionString ?? string.Empty)); protected virtual bool Equals(MySqlOptions other) { diff --git a/test/EFCore.MySql.Tests/MySqlRelationalConnectionTest.cs b/test/EFCore.MySql.Tests/MySqlRelationalConnectionTest.cs index 82844baa..a822ae31 100644 --- a/test/EFCore.MySql.Tests/MySqlRelationalConnectionTest.cs +++ b/test/EFCore.MySql.Tests/MySqlRelationalConnectionTest.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Data.Common; using System.Diagnostics; using System.Transactions; @@ -9,8 +10,10 @@ using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.TestUtilities; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Primitives; using MySqlConnector; using Pomelo.EntityFrameworkCore.MySql.Diagnostics.Internal; using Pomelo.EntityFrameworkCore.MySql.Infrastructure.Internal; @@ -32,6 +35,19 @@ public void Creates_MySql_Server_connection_string() Assert.IsType(connection.DbConnection); } + [Fact] + public void Accepts_named_connection_string() + { + using var connection = CreateConnection( + new DbContextOptionsBuilder() + .UseMySql(@"name=NamedConnectionString", AppConfig.ServerVersion) + .UseApplicationServiceProvider( + new ServiceCollection() + .AddSingleton() + .BuildServiceProvider()) + .Options); + } + [Fact] public void Uses_DbDataSource_from_DbContextOptions() { @@ -274,7 +290,7 @@ public void CurrentAmbientTransaction_returns_transaction_with_AutoEnlist_enable private static MySqlRelationalConnection CreateConnection(DbContextOptions options = null, DbDataSource dataSource = null) { options ??= new DbContextOptionsBuilder() - .UseMySql(@"Server=localhost;User ID=some_user;Password=some_password;Database=MySqlConnectionTest", AppConfig.ServerVersion) + .UseMySql(ConnectionString, AppConfig.ServerVersion) .Options; foreach (var extension in options.Extensions) @@ -318,20 +334,7 @@ private static MySqlRelationalConnection CreateConnection(DbContextOptions optio singletonOptions); } - private const string ConnectionString = "Fake Connection String"; - - private static IDbContextOptions CreateOptions( - RelationalOptionsExtension optionsExtension = null) - { - var optionsBuilder = new DbContextOptionsBuilder(); - - ((IDbContextOptionsBuilderInfrastructure)optionsBuilder) - .AddOrUpdateExtension( - optionsExtension - ?? new FakeRelationalOptionsExtension().WithConnectionString(ConnectionString)); - - return optionsBuilder.Options; - } + private const string ConnectionString = @"Server=localhost;User ID=some_user;Password=some_password;Database=MySqlConnectionTest"; private class FakeDbContext : DbContext { @@ -344,4 +347,22 @@ public FakeDbContext(DbContextOptions options) { } } + + private class FakeConfiguration : IConfiguration + { + public IConfigurationSection GetSection(string key) + => throw new NotImplementedException(); + + public IEnumerable GetChildren() + => throw new NotImplementedException(); + + public IChangeToken GetReloadToken() + => throw new NotImplementedException(); + + public string this[string key] + { + get => ConnectionString; + set => throw new NotImplementedException(); + } + } }