Skip to content

Exception with duplicate FK names: Subquery returns more than 1 row #2010

@carden-jeremy

Description

@carden-jeremy

Describe the bug
When a MariaDB table has duplicate FK names across multiple tables, though unique per-table, Pomelo (or an upstream package?) throws an exception with an non-specific message: "Subquery returns more than 1 row"

I believe MariaDB, as of v12.1, supports FK names that are unique per-table rather than per-database. So, Pomelo should allow that without an error. Either way, if an error must be thrown, please change it to something that better explains the problem: "Duplicate Foreign Key names were detected."

To Reproduce

  1. have a MariaDB database running v12.1.1.
  2. Create two tables that have one FK each, and give each FK the same name.
  3. Run Pomelo code that calls GetConstraints(). That should give you an exception.

Repro console app is attached.

ConsoleApp1.zip

Technical details (please complete the following information):

  • Database server version: MariaDB 12.1.1
  • Operating system: Windows 11 24H2
  • Pomelo.EntityFrameworkCore.MySql version: 9.0.0
  • Other technical details: EF Core Power Tools 2.6.1091
MySqlConnector.MySqlException (0x80004005): Subquery returns more than 1 row
   at MySqlConnector.Core.ServerSession.ReceiveReplyAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ServerSession.cs:line 1081
   at MySqlConnector.Core.ResultSet.ScanRowAsync(IOBehavior ioBehavior, Row row, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ResultSet.cs:line 241
   at MySqlConnector.Core.ResultSet.ReadAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ResultSet.cs:line 204
   at MySqlConnector.Core.ResultSet.Read() in /_/src/MySqlConnector/Core/ResultSet.cs:line 196
   at Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal.MySqlDatabaseModelFactory.GetConstraints(DbConnection connection, IReadOnlyList`1 tables)
   at Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal.MySqlDatabaseModelFactory.GetTables(DbConnection connection, Func`3 filter, String defaultCharSet, String defaultCollation)
   at Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal.MySqlDatabaseModelFactory.GetDatabase(DbConnection connection, DatabaseModelFactoryOptions options)
   at Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal.MySqlDatabaseModelFactory.Create(DbConnection connection, DatabaseModelFactoryOptions options)
   at Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal.MySqlDatabaseModelFactory.Create(String connectionString, DatabaseModelFactoryOptions options)
   at RevEng.Core.ReverseEngineerScaffolder.ScaffoldModel(String connectionString, DatabaseModelFactoryOptions databaseOptions, ModelReverseEngineerOptions modelOptions, ModelCodeGenerationOptions codeOptions, Boolean removeNullableBoolDefaults, Boolean excludeNavigations, Boolean dbContextOnly, Boolean entitiesOnly, Boolean useSchemaFolders, Boolean useSchemaNamespaces) in D:\a\EFCorePowerTools\EFCorePowerTools\src\Core\RevEng.Core.80\ReverseEngineerScaffolder.cs:line 468
   at RevEng.Core.ReverseEngineerScaffolder.GenerateDbContext(ReverseEngineerCommandOptions options, List`1 schemas, String outputContextDir, String modelNamespace, String contextNamespace, String projectPath, String outputPath, String rootNameSpace) in D:\a\EFCorePowerTools\EFCorePowerTools\src\Core\RevEng.Core.80\ReverseEngineerScaffolder.cs:line 93
   at RevEng.Core.ReverseEngineerRunner.GenerateFiles(ReverseEngineerCommandOptions options) in D:\a\EFCorePowerTools\EFCorePowerTools\src\Core\RevEng.Core.80\ReverseEngineerRunner.cs:line 92

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions