From 3ff71c052e40f9bdce966cd426be34bff9d4445f Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 26 Jul 2025 12:11:45 +0800 Subject: [PATCH 1/5] Support both `MySql.EntityFrameworkCore` & `Pomelo.EntityFrameworkCore.MySql`. --- Directory.Packages.props | 1 + .../Volo.Abp.EntityFrameworkCore.MySQL.csproj | 1 + ...textConfigurationContextMySQLExtensions.cs | 34 +++++++++++++- .../AbpDbContextOptionsMySQLExtensions.cs | 45 +++++++++++++++++-- .../MySqlConnectionStringChecker.cs | 2 +- 5 files changed, 76 insertions(+), 7 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 5d9885ddbd..275db7ca5c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -137,6 +137,7 @@ + diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj index 3b039a3ef0..59b5b3c138 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj @@ -22,6 +22,7 @@ + diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs index 07381983ca..11d14ff9e3 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs @@ -1,16 +1,29 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; using System; -using Microsoft.EntityFrameworkCore.Infrastructure; using Volo.Abp.EntityFrameworkCore.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore; public static class AbpDbContextConfigurationContextMySQLExtensions { + /// + /// This extension method is configuring the use Pomelo.EntityFrameworkCore.MySql as the database provider. + /// + [Obsolete("Use UsePomeloMySQL instead.")] public static DbContextOptionsBuilder UseMySQL( [NotNull] this AbpDbContextConfigurationContext context, - Action? mySQLOptionsAction = null) + Action? mySQLOptionsAction = null) + { + return context.UsePomeloMySQL(mySQLOptionsAction); + } + + /// + /// This extension method is configuring the use Pomelo.EntityFrameworkCore.MySql as the database provider. + /// + public static DbContextOptionsBuilder UsePomeloMySQL( + [NotNull] this AbpDbContextConfigurationContext context, + Action? mySQLOptionsAction = null) { if (context.ExistingConnection != null) { @@ -31,4 +44,21 @@ public static class AbpDbContextConfigurationContextMySQLExtensions }); } } + + /// + /// This extension method is configuring the use MySql.EntityFrameworkCore as the database provider. + /// + public static DbContextOptionsBuilder UseMySQL( + [NotNull] this AbpDbContextConfigurationContext context, + Action? mySQLOptionsAction = null) + { + if (context.ExistingConnection != null) + { + return context.DbContextOptions.UseMySQL(context.ExistingConnection, mySQLOptionsAction); + } + else + { + return context.DbContextOptions.UseMySQL(context.ConnectionString, mySQLOptionsAction); + } + } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs index baf8c53a14..3f41ae931f 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs @@ -1,14 +1,51 @@ using JetBrains.Annotations; using System; -using Microsoft.EntityFrameworkCore.Infrastructure; namespace Volo.Abp.EntityFrameworkCore; public static class AbpDbContextOptionsMySQLExtensions { + [Obsolete("Use UsePomeloMySQL instead.")] public static void UseMySQL( - [NotNull] this AbpDbContextOptions options, - Action? mySQLOptionsAction = null) + [NotNull] this AbpDbContextOptions options, + Action? mySQLOptionsAction = null) + { + options.UsePomeloMySQL(mySQLOptionsAction); + } + + [Obsolete("Use UsePomeloMySQL instead.")] + public static void UseMySQL( + [NotNull] this AbpDbContextOptions options, + Action? mySQLOptionsAction = null) + where TDbContext : AbpDbContext + { + options.UsePomeloMySQL(mySQLOptionsAction); + } + + public static void UsePomeloMySQL( + [NotNull] this AbpDbContextOptions options, + Action? mySQLOptionsAction = null) + { + options.Configure(context => + { + context.UsePomeloMySQL(mySQLOptionsAction); + }); + } + + public static void UsePomeloMySQL( + [NotNull] this AbpDbContextOptions options, + Action? mySQLOptionsAction = null) + where TDbContext : AbpDbContext + { + options.Configure(context => + { + context.UsePomeloMySQL(mySQLOptionsAction); + }); + } + + public static void UseMySQL( + [NotNull] this AbpDbContextOptions options, + Action? mySQLOptionsAction = null) { options.Configure(context => { @@ -18,7 +55,7 @@ public static class AbpDbContextOptionsMySQLExtensions public static void UseMySQL( [NotNull] this AbpDbContextOptions options, - Action? mySQLOptionsAction = null) + Action? mySQLOptionsAction = null) where TDbContext : AbpDbContext { options.Configure(context => diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs index 88dc7912f3..a06c84171b 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs @@ -1,6 +1,6 @@ using System; using System.Threading.Tasks; -using MySqlConnector; +using MySql.Data.MySqlClient; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; From a56ff20c1ad74ca12abb58f50acd7f4cd1a5b3ce Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 26 Jul 2025 18:19:26 +0800 Subject: [PATCH 2/5] Rename MySQL extension methods for clarity --- docs/en/framework/data/entity-framework-core/mysql.md | 10 +++++++--- .../AbpDbContextConfigurationContextMySQLExtensions.cs | 2 +- .../AbpDbContextOptionsMySQLExtensions.cs | 8 ++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/docs/en/framework/data/entity-framework-core/mysql.md b/docs/en/framework/data/entity-framework-core/mysql.md index 7760598414..64fa500b89 100644 --- a/docs/en/framework/data/entity-framework-core/mysql.md +++ b/docs/en/framework/data/entity-framework-core/mysql.md @@ -12,15 +12,19 @@ This document explains how to switch to the **MySQL** database provider for **[t Find ***YourProjectName*EntityFrameworkCoreModule** class inside the `.EntityFrameworkCore` project, remove `typeof(AbpEntityFrameworkCoreSqlServerModule)` from the `DependsOn` attribute, add `typeof(AbpEntityFrameworkCoreMySQLModule)` (also replace `using Volo.Abp.EntityFrameworkCore.SqlServer;` with `using Volo.Abp.EntityFrameworkCore.MySQL;`). -## UseMySQL() +## UsePomeloMySQL() Find `UseSqlServer()` calls in your solution. Check the following files: -* *YourProjectName*EntityFrameworkCoreModule.cs inside the `.EntityFrameworkCore` project. Replace `UseSqlServer()` with `UseMySQL()`. -* *YourProjectName*DbContextFactory.cs inside the `.EntityFrameworkCore` project. Replace `UseSqlServer()` with `UseMySql()`. Then add a new parameter (`ServerVersion`) to `UseMySql()` method. Example: `.UseMySql(configuration.GetConnectionString("Default"), ServerVersion.Parse("8.0.21-mysql"))`. See [this issue](https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/pull/1233) for more information about `ServerVersion`) +* *YourProjectName*EntityFrameworkCoreModule.cs inside the `.EntityFrameworkCore` project. Replace `UseSqlServer()` with `UsePomeloMySQL()`. +* *YourProjectName*DbContextFactory.cs inside the `.EntityFrameworkCore` project. Replace `UseSqlServer()` with `UsePomeloMySQL()`. > Depending on your solution structure, you may find more code files need to be changed. +## UseMySQLConnector() + +You can also use the [MySql.EntityFrameworkCore](https://www.nuget.org/packages/MySql.EntityFrameworkCore) package instead of the Pomelo provider. If you want to use this package, you need to change the `UseMySQLConnector()` method instead of `UsePomeloMySQL()`. + ## Change the Connection Strings MySQL connection strings are different than SQL Server connection strings. So, check all `appsettings.json` files in your solution and replace the connection strings inside them. See the [connectionstrings.com](https://www.connectionstrings.com/mysql) for details of MySQL connection string options. diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs index 11d14ff9e3..d00fc0d7d2 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs @@ -48,7 +48,7 @@ public static class AbpDbContextConfigurationContextMySQLExtensions /// /// This extension method is configuring the use MySql.EntityFrameworkCore as the database provider. /// - public static DbContextOptionsBuilder UseMySQL( + public static DbContextOptionsBuilder UseMySQLConnector( [NotNull] this AbpDbContextConfigurationContext context, Action? mySQLOptionsAction = null) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs index 3f41ae931f..5418ce4148 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs @@ -43,24 +43,24 @@ public static class AbpDbContextOptionsMySQLExtensions }); } - public static void UseMySQL( + public static void UseMySQLConnector( [NotNull] this AbpDbContextOptions options, Action? mySQLOptionsAction = null) { options.Configure(context => { - context.UseMySQL(mySQLOptionsAction); + context.UseMySQLConnector(mySQLOptionsAction); }); } - public static void UseMySQL( + public static void UseMySQLConnector( [NotNull] this AbpDbContextOptions options, Action? mySQLOptionsAction = null) where TDbContext : AbpDbContext { options.Configure(context => { - context.UseMySQL(mySQLOptionsAction); + context.UseMySQLConnector(mySQLOptionsAction); }); } } From 01c1708494691f7854f64c7dc90059569128e351 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 26 Jul 2025 18:25:49 +0800 Subject: [PATCH 3/5] Update XML docs for MySQL EF Core extension methods --- .../AbpDbContextConfigurationContextMySQLExtensions.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs index d00fc0d7d2..538c33dbf5 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.EntityFrameworkCore; public static class AbpDbContextConfigurationContextMySQLExtensions { /// - /// This extension method is configuring the use Pomelo.EntityFrameworkCore.MySql as the database provider. + /// This extension method configures Pomelo.EntityFrameworkCore.MySql as the database provider. /// [Obsolete("Use UsePomeloMySQL instead.")] public static DbContextOptionsBuilder UseMySQL( @@ -19,7 +19,7 @@ public static class AbpDbContextConfigurationContextMySQLExtensions } /// - /// This extension method is configuring the use Pomelo.EntityFrameworkCore.MySql as the database provider. + /// This extension method configures Pomelo.EntityFrameworkCore.MySql as the database provider. /// public static DbContextOptionsBuilder UsePomeloMySQL( [NotNull] this AbpDbContextConfigurationContext context, @@ -46,7 +46,7 @@ public static class AbpDbContextConfigurationContextMySQLExtensions } /// - /// This extension method is configuring the use MySql.EntityFrameworkCore as the database provider. + /// This extension method configures MySql.EntityFrameworkCore as the database provider. /// public static DbContextOptionsBuilder UseMySQLConnector( [NotNull] this AbpDbContextConfigurationContext context, From a71e944debe22cd004de50c7c3b27e9adefadb93 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 28 Jul 2025 16:26:42 +0800 Subject: [PATCH 4/5] Move `Pomelo` to a new package. --- .../data/entity-framework-core/mysql.md | 16 ++++--- framework/Volo.Abp.sln | 7 +++ .../FodyWeavers.xml | 3 ++ .../FodyWeavers.xsd | 30 +++++++++++++ .../AbpPomeloMySQLModelBuilderExtensions.cs} | 0 ...bp.EntityFrameworkCore.MySQL.Pomelo.csproj | 27 ++++++++++++ ...textConfigurationContextMySQLExtensions.cs | 33 ++++++++++++++ .../AbpDbContextOptionsMySQLExtensions.cs | 29 ++++++++++++ .../PomeloMySQLConnectionStringChecker.cs | 40 +++++++++++++++++ ...AbpEntityFrameworkCoreMySQLPomeloModule.cs | 27 ++++++++++++ .../AbpMySQLModelBuilderExtensions.cs | 12 +++++ .../Volo.Abp.EntityFrameworkCore.MySQL.csproj | 1 - ...textConfigurationContextMySQLExtensions.cs | 41 ----------------- .../AbpDbContextOptionsMySQLExtensions.cs | 44 ++----------------- ...ker.cs => MySQLConnectionStringChecker.cs} | 2 +- nupkg/common.ps1 | 1 + 16 files changed, 224 insertions(+), 89 deletions(-) create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/FodyWeavers.xsd rename framework/src/{Volo.Abp.EntityFrameworkCore.MySQL/Microsoft/EntityFrameworkCore/AbpMySqlModelBuilderExtensions.cs => Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Microsoft/EntityFrameworkCore/AbpPomeloMySQLModelBuilderExtensions.cs} (100%) create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo.csproj create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/ConnectionStrings/PomeloMySQLConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/MySQL/AbpEntityFrameworkCoreMySQLPomeloModule.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Microsoft/EntityFrameworkCore/AbpMySQLModelBuilderExtensions.cs rename framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{MySqlConnectionStringChecker.cs => MySQLConnectionStringChecker.cs} (94%) diff --git a/docs/en/framework/data/entity-framework-core/mysql.md b/docs/en/framework/data/entity-framework-core/mysql.md index 64fa500b89..8f299bdee4 100644 --- a/docs/en/framework/data/entity-framework-core/mysql.md +++ b/docs/en/framework/data/entity-framework-core/mysql.md @@ -12,18 +12,24 @@ This document explains how to switch to the **MySQL** database provider for **[t Find ***YourProjectName*EntityFrameworkCoreModule** class inside the `.EntityFrameworkCore` project, remove `typeof(AbpEntityFrameworkCoreSqlServerModule)` from the `DependsOn` attribute, add `typeof(AbpEntityFrameworkCoreMySQLModule)` (also replace `using Volo.Abp.EntityFrameworkCore.SqlServer;` with `using Volo.Abp.EntityFrameworkCore.MySQL;`). -## UsePomeloMySQL() +## UseMySQL() Find `UseSqlServer()` calls in your solution. Check the following files: -* *YourProjectName*EntityFrameworkCoreModule.cs inside the `.EntityFrameworkCore` project. Replace `UseSqlServer()` with `UsePomeloMySQL()`. -* *YourProjectName*DbContextFactory.cs inside the `.EntityFrameworkCore` project. Replace `UseSqlServer()` with `UsePomeloMySQL()`. +* *YourProjectName*EntityFrameworkCoreModule.cs inside the `.EntityFrameworkCore` project. Replace `UseSqlServer()` with `UseMySQL()`. +* *YourProjectName*DbContextFactory.cs inside the `.EntityFrameworkCore` project. Replace `UseSqlServer()` with `UseMySQL()`. > Depending on your solution structure, you may find more code files need to be changed. -## UseMySQLConnector() +## Use Pomelo Provider -You can also use the [MySql.EntityFrameworkCore](https://www.nuget.org/packages/MySql.EntityFrameworkCore) package instead of the Pomelo provider. If you want to use this package, you need to change the `UseMySQLConnector()` method instead of `UsePomeloMySQL()`. +Alternatively, you can use the [Pomelo.EntityFrameworkCore.MySql](https://www.nuget.org/packages/Pomelo.EntityFrameworkCore.MySql) provider. Replace the [Volo.Abp.EntityFrameworkCore.MySQL](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.MySQL) package with the [Volo.Abp.EntityFrameworkCore.MySQL.Pomelo](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo) package in your `.EntityFrameworkCore` project. + +Find ***YourProjectName*EntityFrameworkCoreModule** class inside the `.EntityFrameworkCore` project, replace `typeof(AbpEntityFrameworkCoreMySQLModule)` with `typeof(AbpEntityFrameworkCoreMySQLPomeloModule)` in the `DependsOn` attribute. + +> Depending on your solution structure, you may find more code files need to be changed. + +The `UseMySQL()` method calls remain the same, no changes needed. ## Change the Connection Strings diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 78f7ae0011..4167492d16 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -491,6 +491,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Bunny. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Timing.Tests", "test\Volo.Abp.Timing.Tests\Volo.Abp.Timing.Tests.csproj", "{58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EntityFrameworkCore.MySQL.Pomelo", "src\Volo.Abp.EntityFrameworkCore.MySQL.Pomelo\Volo.Abp.EntityFrameworkCore.MySQL.Pomelo.csproj", "{5B49FE47-A4C5-45BE-A903-8215CF5E2FAF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1465,6 +1467,10 @@ Global {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Debug|Any CPU.Build.0 = Debug|Any CPU {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Release|Any CPU.ActiveCfg = Release|Any CPU {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Release|Any CPU.Build.0 = Release|Any CPU + {5B49FE47-A4C5-45BE-A903-8215CF5E2FAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B49FE47-A4C5-45BE-A903-8215CF5E2FAF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B49FE47-A4C5-45BE-A903-8215CF5E2FAF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B49FE47-A4C5-45BE-A903-8215CF5E2FAF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1712,6 +1718,7 @@ Global {1BBCBA72-CDB6-4882-96EE-D4CD149433A2} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915} = {447C8A77-E5F0-4538-8687-7383196D04EA} {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {5B49FE47-A4C5-45BE-A903-8215CF5E2FAF} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/FodyWeavers.xml b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/FodyWeavers.xml new file mode 100644 index 0000000000..1715698ccd --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/FodyWeavers.xsd b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/FodyWeavers.xsd new file mode 100644 index 0000000000..ffa6fc4b78 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Microsoft/EntityFrameworkCore/AbpMySqlModelBuilderExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Microsoft/EntityFrameworkCore/AbpPomeloMySQLModelBuilderExtensions.cs similarity index 100% rename from framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Microsoft/EntityFrameworkCore/AbpMySqlModelBuilderExtensions.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Microsoft/EntityFrameworkCore/AbpPomeloMySQLModelBuilderExtensions.cs diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo.csproj new file mode 100644 index 0000000000..f92e905688 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo.csproj @@ -0,0 +1,27 @@ + + + + + + + net9.0 + enable + Nullable + Volo.Abp.EntityFrameworkCore.MySQL.Pomelo + Volo.Abp.EntityFrameworkCore.MySQL.Pomelo + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + + + + + diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs new file mode 100644 index 0000000000..9f26be0cf0 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs @@ -0,0 +1,33 @@ +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; +using System; +using Volo.Abp.EntityFrameworkCore.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore; + +public static class AbpDbContextConfigurationContextMySQLExtensions +{ + public static DbContextOptionsBuilder UseMySQL( + [NotNull] this AbpDbContextConfigurationContext context, + Action? mySQLOptionsAction = null) + { + if (context.ExistingConnection != null) + { + return context.DbContextOptions.UseMySql(context.ExistingConnection, + ServerVersion.AutoDetect(context.ConnectionString), optionsBuilder => + { + optionsBuilder.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery); + mySQLOptionsAction?.Invoke(optionsBuilder); + }); + } + else + { + return context.DbContextOptions.UseMySql(context.ConnectionString, + ServerVersion.AutoDetect(context.ConnectionString), optionsBuilder => + { + optionsBuilder.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery); + mySQLOptionsAction?.Invoke(optionsBuilder); + }); + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs new file mode 100644 index 0000000000..67d76fb0a9 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs @@ -0,0 +1,29 @@ +using JetBrains.Annotations; +using System; +using Microsoft.EntityFrameworkCore.Infrastructure; + +namespace Volo.Abp.EntityFrameworkCore; + +public static class AbpDbContextOptionsMySQLExtensions +{ + public static void UseMySQL( + [NotNull] this AbpDbContextOptions options, + Action? mySQLOptionsAction = null) + { + options.Configure(context => + { + context.UseMySQL(mySQLOptionsAction); + }); + } + + public static void UseMySQL( + [NotNull] this AbpDbContextOptions options, + Action? mySQLOptionsAction = null) + where TDbContext : AbpDbContext + { + options.Configure(context => + { + context.UseMySQL(mySQLOptionsAction); + }); + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/ConnectionStrings/PomeloMySQLConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/ConnectionStrings/PomeloMySQLConnectionStringChecker.cs new file mode 100644 index 0000000000..2d7beee20b --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/ConnectionStrings/PomeloMySQLConnectionStringChecker.cs @@ -0,0 +1,40 @@ +using System; +using System.Threading.Tasks; +using MySqlConnector; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[Dependency(ReplaceServices = true)] +public class PomeloMySQLConnectionStringChecker : IConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + try + { + var connString = new MySqlConnectionStringBuilder(connectionString) + { + ConnectionLifeTime = 1 + }; + + var oldDatabaseName = connString.Database; + connString.Database = "mysql"; + + await using var conn = new MySqlConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + await conn.ChangeDatabaseAsync(oldDatabaseName); + result.DatabaseExists = true; + + await conn.CloseAsync(); + + return result; + } + catch (Exception) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/MySQL/AbpEntityFrameworkCoreMySQLPomeloModule.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/MySQL/AbpEntityFrameworkCoreMySQLPomeloModule.cs new file mode 100644 index 0000000000..9d0a473af2 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo/Abp/EntityFrameworkCore/MySQL/AbpEntityFrameworkCoreMySQLPomeloModule.cs @@ -0,0 +1,27 @@ +using Volo.Abp.EntityFrameworkCore.GlobalFilters; +using Volo.Abp.Guids; +using Volo.Abp.Modularity; + +namespace Volo.Abp.EntityFrameworkCore.MySQL; + +[DependsOn( + typeof(AbpEntityFrameworkCoreModule) + )] +public class AbpEntityFrameworkCoreMySQLPomeloModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + if (options.DefaultSequentialGuidType == null) + { + options.DefaultSequentialGuidType = SequentialGuidType.SequentialAsString; + } + }); + + Configure(options => + { + options.UseDbFunction = true; + }); + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Microsoft/EntityFrameworkCore/AbpMySQLModelBuilderExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Microsoft/EntityFrameworkCore/AbpMySQLModelBuilderExtensions.cs new file mode 100644 index 0000000000..dc5d1b4f0d --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Microsoft/EntityFrameworkCore/AbpMySQLModelBuilderExtensions.cs @@ -0,0 +1,12 @@ +using Volo.Abp.EntityFrameworkCore; + +namespace Microsoft.EntityFrameworkCore; + +public static class AbpMySQLModelBuilderExtensions +{ + public static void UseMySQL( + this ModelBuilder modelBuilder) + { + modelBuilder.SetDatabaseProvider(EfCoreDatabaseProvider.MySql); + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj index 59b5b3c138..07b8ad1563 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj @@ -21,7 +21,6 @@ - diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs index 538c33dbf5..b869109a80 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs @@ -7,48 +7,7 @@ namespace Volo.Abp.EntityFrameworkCore; public static class AbpDbContextConfigurationContextMySQLExtensions { - /// - /// This extension method configures Pomelo.EntityFrameworkCore.MySql as the database provider. - /// - [Obsolete("Use UsePomeloMySQL instead.")] public static DbContextOptionsBuilder UseMySQL( - [NotNull] this AbpDbContextConfigurationContext context, - Action? mySQLOptionsAction = null) - { - return context.UsePomeloMySQL(mySQLOptionsAction); - } - - /// - /// This extension method configures Pomelo.EntityFrameworkCore.MySql as the database provider. - /// - public static DbContextOptionsBuilder UsePomeloMySQL( - [NotNull] this AbpDbContextConfigurationContext context, - Action? mySQLOptionsAction = null) - { - if (context.ExistingConnection != null) - { - return context.DbContextOptions.UseMySql(context.ExistingConnection, - ServerVersion.AutoDetect(context.ConnectionString), optionsBuilder => - { - optionsBuilder.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery); - mySQLOptionsAction?.Invoke(optionsBuilder); - }); - } - else - { - return context.DbContextOptions.UseMySql(context.ConnectionString, - ServerVersion.AutoDetect(context.ConnectionString), optionsBuilder => - { - optionsBuilder.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery); - mySQLOptionsAction?.Invoke(optionsBuilder); - }); - } - } - - /// - /// This extension method configures MySql.EntityFrameworkCore as the database provider. - /// - public static DbContextOptionsBuilder UseMySQLConnector( [NotNull] this AbpDbContextConfigurationContext context, Action? mySQLOptionsAction = null) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs index 5418ce4148..cdd8beebde 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs @@ -5,62 +5,24 @@ namespace Volo.Abp.EntityFrameworkCore; public static class AbpDbContextOptionsMySQLExtensions { - [Obsolete("Use UsePomeloMySQL instead.")] public static void UseMySQL( - [NotNull] this AbpDbContextOptions options, - Action? mySQLOptionsAction = null) - { - options.UsePomeloMySQL(mySQLOptionsAction); - } - - [Obsolete("Use UsePomeloMySQL instead.")] - public static void UseMySQL( - [NotNull] this AbpDbContextOptions options, - Action? mySQLOptionsAction = null) - where TDbContext : AbpDbContext - { - options.UsePomeloMySQL(mySQLOptionsAction); - } - - public static void UsePomeloMySQL( - [NotNull] this AbpDbContextOptions options, - Action? mySQLOptionsAction = null) - { - options.Configure(context => - { - context.UsePomeloMySQL(mySQLOptionsAction); - }); - } - - public static void UsePomeloMySQL( - [NotNull] this AbpDbContextOptions options, - Action? mySQLOptionsAction = null) - where TDbContext : AbpDbContext - { - options.Configure(context => - { - context.UsePomeloMySQL(mySQLOptionsAction); - }); - } - - public static void UseMySQLConnector( [NotNull] this AbpDbContextOptions options, Action? mySQLOptionsAction = null) { options.Configure(context => { - context.UseMySQLConnector(mySQLOptionsAction); + context.UseMySQL(mySQLOptionsAction); }); } - public static void UseMySQLConnector( + public static void UseMySQL( [NotNull] this AbpDbContextOptions options, Action? mySQLOptionsAction = null) where TDbContext : AbpDbContext { options.Configure(context => { - context.UseMySQLConnector(mySQLOptionsAction); + context.UseMySQL(mySQLOptionsAction); }); } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySQLConnectionStringChecker.cs similarity index 94% rename from framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySQLConnectionStringChecker.cs index a06c84171b..8dca9074dc 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySQLConnectionStringChecker.cs @@ -7,7 +7,7 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; [Dependency(ReplaceServices = true)] -public class MySqlConnectionStringChecker : IConnectionStringChecker, ITransientDependency +public class MySQLConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index e916a379d2..9dbce186ee 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -178,6 +178,7 @@ $projects = ( "framework/src/Volo.Abp.Emailing", "framework/src/Volo.Abp.EntityFrameworkCore", "framework/src/Volo.Abp.EntityFrameworkCore.MySQL", + "framework/src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo", "framework/src/Volo.Abp.EntityFrameworkCore.Oracle", "framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart", "framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql", From 66e74a45d3839a42bee9e938f6c65c7cf89f454b Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 29 Jul 2025 07:19:46 +0800 Subject: [PATCH 5/5] Update `Pomelo.EntityFrameworkCore.MySql` to `9.0.0-rc.1.efcore.9.0.0` https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/releases/tag/9.0.0-rc.1.efcore.9.0.0 --- Directory.Packages.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 275db7ca5c..5a3c4bdd7e 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -136,7 +136,7 @@ - + @@ -186,4 +186,4 @@ - \ No newline at end of file +