diff --git a/src/Bootstrap/test/AutoConfiguration.Test/Steeltoe.Bootstrap.AutoConfiguration.Test.csproj b/src/Bootstrap/test/AutoConfiguration.Test/Steeltoe.Bootstrap.AutoConfiguration.Test.csproj index 6e06050f02..708988c34c 100644 --- a/src/Bootstrap/test/AutoConfiguration.Test/Steeltoe.Bootstrap.AutoConfiguration.Test.csproj +++ b/src/Bootstrap/test/AutoConfiguration.Test/Steeltoe.Bootstrap.AutoConfiguration.Test.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Connectors/src/EntityFrameworkCore/MySql/DynamicTypeAccess/MySqlDbContextOptionsExtensionsShim.cs b/src/Connectors/src/EntityFrameworkCore/MySql/DynamicTypeAccess/MySqlDbContextOptionsExtensionsShim.cs index 7d95f4d8eb..141a4b78b6 100644 --- a/src/Connectors/src/EntityFrameworkCore/MySql/DynamicTypeAccess/MySqlDbContextOptionsExtensionsShim.cs +++ b/src/Connectors/src/EntityFrameworkCore/MySql/DynamicTypeAccess/MySqlDbContextOptionsExtensionsShim.cs @@ -21,7 +21,7 @@ public static void UseMySql(MySqlEntityFrameworkCorePackageResolver packageResol } else { - UsePomeloMySql(packageResolver, optionsBuilder, connectionString, serverVersion, mySqlOptionsAction); + UseMicrotingOrPomeloMySql(packageResolver, optionsBuilder, connectionString, serverVersion, mySqlOptionsAction); } } @@ -48,7 +48,7 @@ private static void UseOracleMySql(MySqlEntityFrameworkCorePackageResolver packa } } - private static void UsePomeloMySql(MySqlEntityFrameworkCorePackageResolver packageResolver, DbContextOptionsBuilder optionsBuilder, + private static void UseMicrotingOrPomeloMySql(MySqlEntityFrameworkCorePackageResolver packageResolver, DbContextOptionsBuilder optionsBuilder, string? connectionString, object? serverVersion, object? mySqlOptionsAction) { if (serverVersion == null) @@ -58,7 +58,7 @@ private static void UsePomeloMySql(MySqlEntityFrameworkCorePackageResolver packa throw new InvalidOperationException("Server version must be specified when no connection string is provided."); } - // Pomelo requires to specify server version. If not provided, autodetect it (this is the part that creates an extra connection). + // Microting and Pomelo require to specify server version. If not provided, autodetect it (this is the part that creates an extra connection). ServerVersionShim serverVersionShim = ServerVersionShim.AutoDetect(packageResolver, connectionString); serverVersion = serverVersionShim.Instance; } diff --git a/src/Connectors/src/EntityFrameworkCore/MySql/DynamicTypeAccess/MySqlEntityFrameworkCorePackageResolver.cs b/src/Connectors/src/EntityFrameworkCore/MySql/DynamicTypeAccess/MySqlEntityFrameworkCorePackageResolver.cs index 7e739fb6c1..c1610074b2 100644 --- a/src/Connectors/src/EntityFrameworkCore/MySql/DynamicTypeAccess/MySqlEntityFrameworkCorePackageResolver.cs +++ b/src/Connectors/src/EntityFrameworkCore/MySql/DynamicTypeAccess/MySqlEntityFrameworkCorePackageResolver.cs @@ -11,9 +11,16 @@ namespace Steeltoe.Connectors.EntityFrameworkCore.MySql.DynamicTypeAccess; /// internal sealed class MySqlEntityFrameworkCorePackageResolver : PackageResolver { + private const string MicrotingPackageName = "Microting.EntityFrameworkCore.MySql "; private const string PomeloPackageName = "Pomelo.EntityFrameworkCore.MySql"; private const string OraclePackageName = "MySql.EntityFrameworkCore"; + private static readonly List MicrotingAssemblyNames = + [ + "Microting.EntityFrameworkCore.MySql", + "MySqlConnector" + ]; + private static readonly List PomeloAssemblyNames = [ "Pomelo.EntityFrameworkCore.MySql", @@ -26,11 +33,19 @@ internal sealed class MySqlEntityFrameworkCorePackageResolver : PackageResolver "MySql.Data" ]; - public static readonly MySqlEntityFrameworkCorePackageResolver Default = new(PomeloAssemblyNames.Concat(OracleAssemblyNames).ToArray(), [ + public static readonly MySqlEntityFrameworkCorePackageResolver Default = new(((string[]) + [ + .. MicrotingAssemblyNames, + .. PomeloAssemblyNames, + .. OracleAssemblyNames + ]).Distinct().ToArray().AsReadOnly(), [ + MicrotingPackageName, PomeloPackageName, OraclePackageName ]); + internal static readonly MySqlEntityFrameworkCorePackageResolver MicrotingOnly = new(MicrotingAssemblyNames, [MicrotingPackageName]); + internal static readonly MySqlEntityFrameworkCorePackageResolver PomeloOnly = new(PomeloAssemblyNames, [PomeloPackageName]); internal static readonly MySqlEntityFrameworkCorePackageResolver OracleOnly = new(OracleAssemblyNames, [OraclePackageName]); diff --git a/src/Connectors/src/EntityFrameworkCore/MySql/MySqlDbContextOptionsBuilderExtensions.cs b/src/Connectors/src/EntityFrameworkCore/MySql/MySqlDbContextOptionsBuilderExtensions.cs index a5c7a01e9f..5930ee2ce2 100644 --- a/src/Connectors/src/EntityFrameworkCore/MySql/MySqlDbContextOptionsBuilderExtensions.cs +++ b/src/Connectors/src/EntityFrameworkCore/MySql/MySqlDbContextOptionsBuilderExtensions.cs @@ -61,8 +61,8 @@ public static DbContextOptionsBuilder UseMySql(this DbContextOptionsBuilder buil /// The service binding name, or null to use the default service binding. /// /// - /// The version of the database server. This only has an effect if the Pomelo.EntityFrameworkCore.MySql package is being used. Set to null to - /// auto-detect (at the cost of opening an extra connection). + /// The version of the database server. This only has an effect if the Microting.EntityFrameworkCore.MySql or Pomelo.EntityFrameworkCore.MySql package is + /// being used. Set to null to auto-detect (at the cost of opening an extra connection). /// /// /// An action to allow additional MySQL specific configuration. diff --git a/src/Connectors/src/EntityFrameworkCore/Steeltoe.Connectors.EntityFrameworkCore.csproj b/src/Connectors/src/EntityFrameworkCore/Steeltoe.Connectors.EntityFrameworkCore.csproj index ccd06f1162..3fb6865af9 100644 --- a/src/Connectors/src/EntityFrameworkCore/Steeltoe.Connectors.EntityFrameworkCore.csproj +++ b/src/Connectors/src/EntityFrameworkCore/Steeltoe.Connectors.EntityFrameworkCore.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Connectors/test/Connectors.Test/Steeltoe.Connectors.Test.csproj b/src/Connectors/test/Connectors.Test/Steeltoe.Connectors.Test.csproj index bf2405d3f8..1b3a36e05c 100644 --- a/src/Connectors/test/Connectors.Test/Steeltoe.Connectors.Test.csproj +++ b/src/Connectors/test/Connectors.Test/Steeltoe.Connectors.Test.csproj @@ -14,7 +14,7 @@ - + diff --git a/src/Connectors/test/EntityFrameworkCore.Test/MySql/Microting/MySqlDbContextOptionsBuilderExtensionsTest.other.cs b/src/Connectors/test/EntityFrameworkCore.Test/MySql/Microting/MySqlDbContextOptionsBuilderExtensionsTest.other.cs new file mode 100644 index 0000000000..88c6a5bd89 --- /dev/null +++ b/src/Connectors/test/EntityFrameworkCore.Test/MySql/Microting/MySqlDbContextOptionsBuilderExtensionsTest.other.cs @@ -0,0 +1,88 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. + +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Steeltoe.Common.TestResources; +using Steeltoe.Connectors.EntityFrameworkCore.MySql.DynamicTypeAccess; +using Steeltoe.Connectors.MySql; +using Steeltoe.Connectors.MySql.DynamicTypeAccess; +using SteeltoeExtensions = Steeltoe.Connectors.EntityFrameworkCore.MySql.MySqlDbContextOptionsBuilderExtensions; + +namespace Steeltoe.Connectors.EntityFrameworkCore.Test.MySql.Microting; + +public sealed class MySqlDbContextOptionsBuilderExtensionsTest +{ + [Fact] + public async Task Registers_connection_string_for_default_service_binding() + { + var appSettings = new Dictionary + { + ["Steeltoe:Client:MySql:Default:ConnectionString"] = "SERVER=localhost;database=myDb;UID=steeltoe;PWD=steeltoe;connect timeout=15" + }; + + WebApplicationBuilder builder = TestWebApplicationBuilderFactory.Create(); + builder.Configuration.AddInMemoryCollection(appSettings); + builder.AddMySql(MySqlPackageResolver.MySqlConnectorOnly, null, null, null); + builder.Services.Configure(options => options.ConnectionString += ";Use Compression=false"); + + builder.Services.AddDbContext((serviceProvider, options) => SteeltoeExtensions.UseMySql(options, serviceProvider, + MySqlEntityFrameworkCorePackageResolver.MicrotingOnly, serverVersion: MySqlServerVersion.LatestSupportedServerVersion)); + + await using WebApplication app = builder.Build(); + + await using AsyncServiceScope scope = app.Services.CreateAsyncScope(); + await using var dbContext = scope.ServiceProvider.GetRequiredService(); + string? connectionString = dbContext.Database.GetConnectionString(); + + connectionString.Should().Be( + "Server=localhost;User ID=steeltoe;Password=steeltoe;Database=myDb;Allow User Variables=True;Connection Timeout=15;Use Affected Rows=False;Use Compression=False"); + } + + [Fact] + public async Task Registers_connection_string_for_named_service_binding() + { + var appSettings = new Dictionary + { + ["Steeltoe:Client:MySql:myMySqlService:ConnectionString"] = "SERVER=localhost;database=myDb;UID=steeltoe;PWD=steeltoe;connect timeout=15" + }; + + WebApplicationBuilder builder = TestWebApplicationBuilderFactory.Create(); + builder.Configuration.AddInMemoryCollection(appSettings); + builder.AddMySql(MySqlPackageResolver.MySqlConnectorOnly, null, null, null); + builder.Services.Configure("myMySqlService", options => options.ConnectionString += ";Use Compression=false"); + + builder.Services.AddDbContext((serviceProvider, options) => SteeltoeExtensions.UseMySql(options, serviceProvider, + MySqlEntityFrameworkCorePackageResolver.MicrotingOnly, "myMySqlService", MySqlServerVersion.LatestSupportedServerVersion)); + + await using WebApplication app = builder.Build(); + + await using AsyncServiceScope scope = app.Services.CreateAsyncScope(); + await using var dbContext = scope.ServiceProvider.GetRequiredService(); + string? connectionString = dbContext.Database.GetConnectionString(); + + connectionString.Should().Be( + "Server=localhost;User ID=steeltoe;Password=steeltoe;Database=myDb;Allow User Variables=True;Connection Timeout=15;Use Affected Rows=False;Use Compression=False"); + } + + [Fact] + public async Task Throws_for_missing_connection_string_with_version_detection() + { + WebApplicationBuilder builder = TestWebApplicationBuilderFactory.Create(); + builder.AddMySql(MySqlPackageResolver.MySqlConnectorOnly, null, null, null); + + builder.Services.AddDbContext((serviceProvider, options) => SteeltoeExtensions.UseMySql(options, serviceProvider, + MySqlEntityFrameworkCorePackageResolver.MicrotingOnly)); + + await using WebApplication app = builder.Build(); + await using AsyncServiceScope scope = app.Services.CreateAsyncScope(); + + // ReSharper disable once AccessToDisposedClosure + Action action = () => _ = scope.ServiceProvider.GetRequiredService(); + + action.Should().ThrowExactly().WithMessage("Server version must be specified when no connection string is provided."); + } +} diff --git a/src/Connectors/test/EntityFrameworkCore.Test/MySql/Pomelo/MySqlDbContextOptionsBuilderExtensionsTest.cs b/src/Connectors/test/EntityFrameworkCore.Test/MySql/Pomelo/MySqlDbContextOptionsBuilderExtensionsTest.net80-90.cs similarity index 93% rename from src/Connectors/test/EntityFrameworkCore.Test/MySql/Pomelo/MySqlDbContextOptionsBuilderExtensionsTest.cs rename to src/Connectors/test/EntityFrameworkCore.Test/MySql/Pomelo/MySqlDbContextOptionsBuilderExtensionsTest.net80-90.cs index 7e8e974935..fb7001e67a 100644 --- a/src/Connectors/test/EntityFrameworkCore.Test/MySql/Pomelo/MySqlDbContextOptionsBuilderExtensionsTest.cs +++ b/src/Connectors/test/EntityFrameworkCore.Test/MySql/Pomelo/MySqlDbContextOptionsBuilderExtensionsTest.net80-90.cs @@ -16,11 +16,7 @@ namespace Steeltoe.Connectors.EntityFrameworkCore.Test.MySql.Pomelo; public sealed class MySqlDbContextOptionsBuilderExtensionsTest { -#if NET10_0_OR_GREATER - [Fact(Skip = "Temporary workaround: Unstable EF Core 10 package for Pomelo.EntityFrameworkCore.MySql is not available yet.")] -#else [Fact] -#endif public async Task Registers_connection_string_for_default_service_binding() { var appSettings = new Dictionary @@ -46,11 +42,7 @@ public async Task Registers_connection_string_for_default_service_binding() "Server=localhost;User ID=steeltoe;Password=steeltoe;Database=myDb;Allow User Variables=True;Connection Timeout=15;Use Affected Rows=False;Use Compression=False"); } -#if NET10_0_OR_GREATER - [Fact(Skip = "Temporary workaround: Unstable EF Core 10 package for Pomelo.EntityFrameworkCore.MySql is not available yet.")] -#else [Fact] -#endif public async Task Registers_connection_string_for_named_service_binding() { var appSettings = new Dictionary diff --git a/src/Connectors/test/EntityFrameworkCore.Test/Steeltoe.Connectors.EntityFrameworkCore.Test.csproj b/src/Connectors/test/EntityFrameworkCore.Test/Steeltoe.Connectors.EntityFrameworkCore.Test.csproj index 626d5effb2..9a56a36f71 100644 --- a/src/Connectors/test/EntityFrameworkCore.Test/Steeltoe.Connectors.EntityFrameworkCore.Test.csproj +++ b/src/Connectors/test/EntityFrameworkCore.Test/Steeltoe.Connectors.EntityFrameworkCore.Test.csproj @@ -1,27 +1,18 @@ - + net10.0;net9.0;net8.0 - - - - $(NoWarn);NU1608 - - - - - - - - - + + + + + + + @@ -29,4 +20,14 @@ + + + + + + + + + + diff --git a/src/Management/test/Endpoint.Test/Steeltoe.Management.Endpoint.Test.csproj b/src/Management/test/Endpoint.Test/Steeltoe.Management.Endpoint.Test.csproj index 97607ba184..5e8248c8ea 100644 --- a/src/Management/test/Endpoint.Test/Steeltoe.Management.Endpoint.Test.csproj +++ b/src/Management/test/Endpoint.Test/Steeltoe.Management.Endpoint.Test.csproj @@ -14,9 +14,9 @@ - - - + + + diff --git a/src/Steeltoe.All.slnx.DotSettings b/src/Steeltoe.All.slnx.DotSettings index e5d2d1cfe6..354c182659 100644 --- a/src/Steeltoe.All.slnx.DotSettings +++ b/src/Steeltoe.All.slnx.DotSettings @@ -695,6 +695,7 @@ $left$ = $right$; True True True + True True True True diff --git a/versions.props b/versions.props index 618acfc5e9..b07fc39574 100644 --- a/versions.props +++ b/versions.props @@ -15,7 +15,7 @@ 7.0.* 3.8.* 4.20.69 - 2.5.* + 2.6.* 9.7.* 13.0.* 3.3.* @@ -32,24 +32,6 @@ 3.1.* - - 8.0.* - $(EntityFrameworkCoreTestVersion) - - - - 9.0.* - $(EntityFrameworkCoreTestVersion) - - - - 10.0.* - - - 9.0.* - - -