Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="MongoDB.Driver" Version="$(MongoDbDriverVersion)" />
<PackageReference Include="MySqlConnector" Version="$(MySqlConnectorVersion)" />
<PackageReference Include="Npgsql" Version="$(EntityFrameworkCoreTestVersion)" />
<PackageReference Include="Npgsql" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="RabbitMQ.Client" Version="$(RabbitClientTestVersion)" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public static void UseMySql(MySqlEntityFrameworkCorePackageResolver packageResol
}
else
{
UsePomeloMySql(packageResolver, optionsBuilder, connectionString, serverVersion, mySqlOptionsAction);
UseMicrotingOrPomeloMySql(packageResolver, optionsBuilder, connectionString, serverVersion, mySqlOptionsAction);
}
}

Expand All @@ -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)
Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,16 @@ namespace Steeltoe.Connectors.EntityFrameworkCore.MySql.DynamicTypeAccess;
/// </summary>
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<string> MicrotingAssemblyNames =
[
"Microting.EntityFrameworkCore.MySql",
"MySqlConnector"
];

private static readonly List<string> PomeloAssemblyNames =
[
"Pomelo.EntityFrameworkCore.MySql",
Expand All @@ -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]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ public static DbContextOptionsBuilder UseMySql(this DbContextOptionsBuilder buil
/// The service binding name, or <c>null</c> to use the default service binding.
/// </param>
/// <param name="serverVersion">
/// The version of the database server. This only has an effect if the Pomelo.EntityFrameworkCore.MySql package is being used. Set to <c>null</c> 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 <c>null</c> to auto-detect (at the cost of opening an extra connection).
/// </param>
/// <param name="mySqlOptionsAction">
/// An action to allow additional MySQL specific configuration.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<Import Project="..\..\..\..\shared.props" />

<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="$(EntityFrameworkCoreVersion)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="$(MatchTargetFrameworkVersion)" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<PackageReference Include="MongoDB.Driver" Version="$(MongoDbDriverVersion)" />
<PackageReference Include="MySqlConnector" Version="$(MySqlConnectorVersion)" />
<PackageReference Include="MySql.Data" Version="$(MySqlDataVersion)" />
<PackageReference Include="Npgsql" Version="$(EntityFrameworkCoreTestVersion)" />
<PackageReference Include="Npgsql" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="RabbitMQ.Client" Version="$(RabbitClientTestVersion)" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
@@ -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<string, string?>
{
["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<MySqlOptions>(options => options.ConnectionString += ";Use Compression=false");

builder.Services.AddDbContext<GoodDbContext>((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<GoodDbContext>();
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<string, string?>
{
["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<MySqlOptions>("myMySqlService", options => options.ConnectionString += ";Use Compression=false");

builder.Services.AddDbContext<GoodDbContext>((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<GoodDbContext>();
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<GoodDbContext>((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<GoodDbContext>();

action.Should().ThrowExactly<InvalidOperationException>().WithMessage("Server version must be specified when no connection string is provided.");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, string?>
Expand All @@ -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<string, string?>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,33 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net10.0;net9.0;net8.0</TargetFrameworks>
</PropertyGroup>

<Import Project="..\..\..\..\shared.props" />

<PropertyGroup>
<NoWarn>
<!--
Temporary workaround: Unstable EF Core 10 package for Pomelo.EntityFrameworkCore.MySql is not available yet.
NU1608: Detected package version outside of dependency constraint
-->
$(NoWarn);NU1608
</NoWarn>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="$(EntityFrameworkCoreTestVersion)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="$(EntityFrameworkCoreTestVersion)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="$(EntityFrameworkCoreTestVersion)" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="$(EntityFrameworkCoreTestVersion)" />
<PackageReference Include="MySql.EntityFrameworkCore" Version="$(EntityFrameworkCoreTestVersion)" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="$(PomeloEntityFrameworkCoreTestVersion)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="Microting.EntityFrameworkCore.MySql" Condition="'$(TargetFramework)' != 'net9.0' And '$(TargetFramework)' != 'net8.0'" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="MySql.EntityFrameworkCore" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Condition="'$(TargetFramework)' == 'net9.0' Or '$(TargetFramework)' == 'net8.0'" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="System.Text.Json" Version="$(FoundationalVersion)" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\Management\src\Tasks\Steeltoe.Management.Tasks.csproj" />
<ProjectReference Include="..\..\src\EntityFrameworkCore\Steeltoe.Connectors.EntityFrameworkCore.csproj" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net9.0' Or '$(TargetFramework)' == 'net8.0' ">
<Compile Remove="**/*.other.cs" />
<None Include="**/*.other.cs" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' != 'net9.0' And '$(TargetFramework)' != 'net8.0' ">
<Compile Remove="**/*.net80-90.cs" />
<None Include="**/*.net80-90.cs" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
<ItemGroup>
<PackageReference Include="AspNetCore.HealthChecks.System" Version="$(AspNetCoreHealthChecksVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="$(EntityFrameworkCoreTestVersion)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="$(EntityFrameworkCoreTestVersion)" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="$(EntityFrameworkCoreTestVersion)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="$(MatchTargetFrameworkVersion)" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="$(MatchTargetFrameworkVersion)" />
</ItemGroup>

<ItemGroup>
Expand Down
1 change: 1 addition & 0 deletions src/Steeltoe.All.slnx.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -695,6 +695,7 @@ $left$ = $right$;</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=hwnd/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=instrumentations/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=liveness/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Microting/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=otlp/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Pomelo/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=PostgreSQL/@EntryIndexedValue">True</s:Boolean>
Expand Down
21 changes: 1 addition & 20 deletions versions.props
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<MockHttpVersion>7.0.*</MockHttpVersion>
<MongoDbDriverVersion>3.8.*</MongoDbDriverVersion>
<MoqVersion>4.20.69</MoqVersion>
<MySqlConnectorVersion>2.5.*</MySqlConnectorVersion>
<MySqlConnectorVersion>2.6.*</MySqlConnectorVersion>
<MySqlDataVersion>9.7.*</MySqlDataVersion>
<NewtonsoftJsonVersion>13.0.*</NewtonsoftJsonVersion>
<PublicApiAnalyzersVersion>3.3.*</PublicApiAnalyzersVersion>
Expand All @@ -32,24 +32,6 @@
<XunitVisualStudioVersion>3.1.*</XunitVisualStudioVersion>
</PropertyGroup>

<PropertyGroup Condition="'$(TargetFramework)' == 'net8.0'">
<EntityFrameworkCoreTestVersion>8.0.*</EntityFrameworkCoreTestVersion>
<PomeloEntityFrameworkCoreTestVersion>$(EntityFrameworkCoreTestVersion)</PomeloEntityFrameworkCoreTestVersion>
</PropertyGroup>

<PropertyGroup Condition="'$(TargetFramework)' == 'net9.0'">
<EntityFrameworkCoreTestVersion>9.0.*</EntityFrameworkCoreTestVersion>
<PomeloEntityFrameworkCoreTestVersion>$(EntityFrameworkCoreTestVersion)</PomeloEntityFrameworkCoreTestVersion>
</PropertyGroup>

<PropertyGroup Condition="'$(TargetFramework)' == 'net10.0'">
<EntityFrameworkCoreTestVersion>10.0.*</EntityFrameworkCoreTestVersion>
<PomeloEntityFrameworkCoreTestVersion>
<!-- Temporary workaround: Unstable EF Core 10 package for Pomelo.EntityFrameworkCore.MySql is not available yet. -->
9.0.*
</PomeloEntityFrameworkCoreTestVersion>
</PropertyGroup>

<PropertyGroup>
<!--
Exposed dependencies, observable by Steeltoe library consumers.
Expand All @@ -61,7 +43,6 @@
<BouncyCastleVersion>2.2.*</BouncyCastleVersion>
<ConsulVersion>1.7.14.*</ConsulVersion>
<DotnetGCDumpVersion>9.0.652701</DotnetGCDumpVersion>
<EntityFrameworkCoreVersion>8.0.*</EntityFrameworkCoreVersion>
<FoundationalVersion>
<!--
Package versions of this category are always safe to update to the latest version, because they multi-target all frameworks.
Expand Down
Loading