Ошибка во время миграции MySql.EntityFrameworkCore

Рейтинг: 0Ответов: 0Опубликовано: 17.03.2023

Проект .net core, БД Mysql(MySql.EntityFrameworkCore).

Модель:

public class ProductInvoice
{
    public int IdInvoice { get; set; }
    public int IdProduct { get; set; }
    public int IdCell { get; set; }
    
    public int Count { get; set; }
    public Product Product { get; set; }
    public Invoice Invoice { get; set; }
    public WarehouseStreetLevelCell Cell { get; set; }
} 

OnModelCreating:

//Many to many Invoice vs Products
modelBuilder.Entity<ProductInvoice>()
    .HasKey(p => new { p.IdInvoice, p.IdProduct, p.IdCell });

modelBuilder.Entity<ProductInvoice>()
    .HasOne(ru => ru.Product)
    .WithMany(r => r.ProductInvoices)
    .HasForeignKey(pr => pr.IdProduct);

modelBuilder.Entity<ProductInvoice>()
    .HasOne(pr => pr.Invoice)
    .WithMany(p => p.ProductInvoices)
    .HasForeignKey(pr => pr.IdInvoice);

modelBuilder.Entity<ProductInvoice>()
    .HasOne(pr => pr.Cell)
    .WithMany(p => p.Invoices)
    .HasForeignKey(pr => pr.IdCell);  

Миграция:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropPrimaryKey(
        name: "PK_ProductsInvoices",
        table: "ProductsInvoices");

    migrationBuilder.AddPrimaryKey(
        name: "PK_ProductsInvoices",
        table: "ProductsInvoices",
        columns: new[] { "IdInvoice", "IdProduct", "IdCell" });
} 

Таблица пустая, данных в ней нет. Скрин структуры таблицы:
введите сюда описание изображения

Ошибка при попытке сделать update:

fail: Microsoft.EntityFrameworkCore.Database.Command[20102] Failed executing DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] DROP PROCEDURE IF EXISTS MYSQL_AFTER_ADD_PRIMARY_KEY; CREATE PROCEDURE MYSQL_AFTER_ADD_PRIMARY_KEY(IN SCHEMA_NAME_ARGUMENT VARCHAR(255), IN TABLE_NAME_ARGUMENT VARCHAR(255), IN COLUMN_NAME_ARGUMENT VARCHAR(255)) BEGIN DECLARE HAS_AUTO_INCREMENT_ID INT(11); 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 COLUMN_NAME = COLUMN_NAME_ARGUMENT AND COLUMN_TYPE LIKE '%int%' AND COLUMN_KEY = 'PRI'; 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_NAME = COLUMN_NAME_ARGUMENT AND COLUMN_TYPE LIKE '%int%' AND COLUMN_KEY = 'PRI'; 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_NAME = COLUMN_NAME_ARGUMENT AND COLUMN_TYPE LIKE '%int%' AND COLUMN_KEY = 'PRI'; 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 AUTO_INCREMENT;'); 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 (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] DROP PROCEDURE IF EXISTS MYSQL_AFTER_ADD_PRIMARY_KEY; CREATE PROCEDURE MYSQL_AFTER_ADD_PRIMARY_KEY(IN SCHEMA_NAME_ARGUMENT VARCHAR(255), IN TABLE_NAME_ARGUMENT VARCHAR(255), IN COLUMN_NAME_ARGUMENT VARCHAR(255)) BEGIN DECLARE HAS_AUTO_INCREMENT_ID INT(11); 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 COLUMN_NAME = COLUMN_NAME_ARGUMENT AND COLUMN_TYPE LIKE '%int%' AND COLUMN_KEY = 'PRI'; 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_NAME = COLUMN_NAME_ARGUMENT AND COLUMN_TYPE LIKE '%int%' AND COLUMN_KEY = 'PRI'; 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_NAME = COLUMN_NAME_ARGUMENT AND COLUMN_TYPE LIKE '%int%' AND COLUMN_KEY = 'PRI'; 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 AUTO_INCREMENT;'); SET @SQL_EXP = SQL_EXP; PREPARE SQL_EXP_EXECUTE FROM @SQL_EXP; EXECUTE SQL_EXP_EXECUTE; DEALLOCATE PREPARE SQL_EXP_EXECUTE; END IF; END; 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.SerializeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName, Int32 parameterIndex) at MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet) at MySql.Data.MySqlClient.Statement.BindParameters() at MySql.Data.MySqlClient.PreparableStatement.Execute() at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary2 parameterValues) at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable1 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.

Ответы

Ответов пока нет.