.Net Core 8 Entity Framework (MySQL) DROP PROCEDURE IF EXISTS `MYSQL_BEFORE_DROP_PRIMARY_KEY` 错误

问题描述 投票:0回答:1

我创建了一个迁移来添加几个表并更新一个表(添加一列)。数据库是MySQL 8.0.31,EF提供者是Oracle的MySql.EntityFrameworkCore

迁移已成功完成,但是当我运行

dotnet ef database update
时,我收到此错误,我在网上找不到。

就上下文而言,这是一个全新的项目,之前仅进行过两次迁移。

错误:

fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
      Failed executing DbCommand (8ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      DROP PROCEDURE IF EXISTS `MYSQL_BEFORE_DROP_PRIMARY_KEY`;
        CREATE PROCEDURE `MYSQL_BEFORE_DROP_PRIMARY_KEY`(IN `SCHEMA_NAME_ARGUMENT` VARCHAR(255), IN `TABLE_NAME_ARGUMENT` VARCHAR(255))
        BEGIN
          DECLARE HAS_AUTO_INCREMENT_ID TINYINT(1);
          DECLARE PRIMARY_KEY_COLUMN_NAME VARCHAR(255);
          DECLARE PRIMARY_KEY_TYPE VARCHAR(255);
          DECLARE SQL_EXP VARCHAR(1000);
          SELECT COUNT(*)
          INTO HAS_AUTO_INCREMENT_ID
          FROM `information_schema`.`COLUMNS`
          WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA()))
            AND `TABLE_NAME` = TABLE_NAME_ARGUMENT
            AND `Extra` = 'auto_increment'
            AND `COLUMN_KEY` = 'PRI'
            LIMIT 1;
          IF HAS_AUTO_INCREMENT_ID THEN
          SELECT `COLUMN_TYPE`
            INTO PRIMARY_KEY_TYPE
            FROM `information_schema`.`COLUMNS`
            WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA()))
            AND `TABLE_NAME` = TABLE_NAME_ARGUMENT
            AND `COLUMN_KEY` = 'PRI'
            LIMIT 1;
          SELECT `COLUMN_NAME`
            INTO PRIMARY_KEY_COLUMN_NAME
            FROM `information_schema`.`COLUMNS`
            WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA()))
            AND `TABLE_NAME` = TABLE_NAME_ARGUMENT
            AND `COLUMN_KEY` = 'PRI'
            LIMIT 1;
          SET SQL_EXP = CONCAT('ALTER TABLE `', (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())), '`.`', TABLE_NAME_ARGUMENT, '` MODIFY COLUMN `', PRIMARY_KEY_COLUMN_NAME, '` ', PRIMARY_KEY_TYPE, ' NOT NULL;');
          SET @SQL_EXP = SQL_EXP;
          PREPARE SQL_EXP_EXECUTE FROM @SQL_EXP;
          EXECUTE SQL_EXP_EXECUTE;
          DEALLOCATE PREPARE SQL_EXP_EXECUTE;
          END IF;
        END;
Failed executing DbCommand (8ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command execution.
 ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Parameter '@SQL_EXP' must be defined.
   at MySql.Data.MySqlClient.Statement.SerializeParameterAsync(MySqlParameterCollection parameters, MySqlPacket packet, String parmName, Int32 parameterIndex, Boolean execAsync)
   at MySql.Data.MySqlClient.Statement.InternalBindParametersAsync(String sql, MySqlParameterCollection parameters, MySqlPacket packet, Boolean execAsync)
   at MySql.Data.MySqlClient.Statement.BindParametersAsync(Boolean execAsync)
   at MySql.Data.MySqlClient.Statement.ExecuteAsync(Boolean execAsync)
   at MySql.Data.MySqlClient.PreparableStatement.ExecuteAsync(Boolean execAsync)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReaderAsync(CommandBehavior behavior, Boolean execAsync, CancellationToken cancellationToken)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReaderAsync(CommandBehavior behavior, Boolean execAsync, CancellationToken cancellationToken)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReaderAsync(CommandBehavior behavior, Boolean execAsync, CancellationToken cancellationToken)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQueryAsync(Boolean execAsync, CancellationToken cancellationToken)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Fatal error encountered during command execution.

如何解决这个问题?

c# asp.net entity-framework-core mysql-8.0 mysql.data
1个回答
0
投票

我使用了

MySql.EntityFrameworkCore
并且遇到了同样的问题。当我在
Pomelo.EntityFrameworkCore.MySql
上替换它时,所有迁移都接受良好。我建议使用
Pomelo.EntityFrameworkCore.MySql
,从
MySql.EntityFrameworkCore
迁移后不需要太多改变,连接有一点不同,仅此而已。

© www.soinside.com 2019 - 2024. All rights reserved.