Ссылающийся столбец «столбец» и ссылочный столбец «Id» в ограничении внешнего ключа «foreign_key» несовместимы

Я пытаюсь создать миграцию, используя структуру сущностей, но я продолжаю натыкаться на

Referencing column 'TaskId' and referenced column 'Id' in foreign key constraint 'FK_WorkerTaskTargetReference_WorkerTask_TaskId' are incompatible.

И я понятия не имею, почему.

Моя конфигурация кажется правильной:

public class WorkerTaskConfiguration : EntityConfiguration<WorkerTask>
    {
        public override void Configure()
        {
            Entity.Property(x => x.CreatedBy).IsRequired().HasMaxLength(DataModelConstants.DEFAULT_FIELD_LENGTH);
            Entity.Property(x => x.UpdatedBy).IsRequired().HasMaxLength(DataModelConstants.DEFAULT_FIELD_LENGTH);
            Entity.HasMany(x => x.Messages).WithOne(x => x.Task).HasForeignKey(x => x.TaskId).IsRequired();
            Entity.HasMany(x => x.TargetReferences).WithOne(x => x.Task).HasForeignKey(x => x.TaskId).IsRequired();
        }
}

  public class WorkerTaskTargetReferenceConfiguration : EntityConfiguration<WorkerTaskTargetReference>
    {
        public override void Configure()
        {
            Entity.HasKey(e => e.Id);
            Entity.Property(e => e.CreatedBy).IsRequired().HasMaxLength(DataModelConstants.DEFAULT_FIELD_LENGTH);
            Entity.Property(e => e.UpdatedBy).IsRequired().HasMaxLength(DataModelConstants.DEFAULT_FIELD_LENGTH);
        }
    }

Но когда я применяю свою миграцию:

Failed executing DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE `WorkerTaskTargetReference` (
    `Id` char(36) NOT NULL,
    `Type` int NOT NULL,
    `ReferencedId` char(36) NOT NULL,
    `CreatedOn` datetime(6) NOT NULL,
    `UpdatedOn` datetime(6) NOT NULL,
    `CreatedBy` varchar(512) CHARACTER SET utf8mb4 NOT NULL,
    `UpdatedBy` varchar(512) CHARACTER SET utf8mb4 NOT NULL,
    `TaskId` char(36) NOT NULL,
    CONSTRAINT `PK_WorkerTaskTargetReference` PRIMARY KEY (`Id`),
    CONSTRAINT `FK_WorkerTaskTargetReference_WorkerTask_TaskId` FOREIGN KEY (`TaskId`) REFERENCES `WorkerTask` (`Id`) ON DELETE CASCADE
);
MySql.Data.MySqlClient.MySqlException (0x80004005): Referencing column 'TaskId' and referenced column 'Id' in foreign key constraint 'FK_WorkerTaskTargetReference_WorkerTask_TaskId' are incompatible.

Миграция:

    migrationBuilder.CreateTable(
        name: "WorkerTaskTargetReference",
        columns: table => new
    {
        Id = table.Column<Guid>(nullable: false),
        Type = table.Column<int>(nullable: false),
        ReferencedId = table.Column<Guid>(nullable: false),
        CreatedOn = table.Column<DateTimeOffset>(nullable: false),
        UpdatedOn = table.Column<DateTimeOffset>(nullable: false),
        CreatedBy = table.Column<string>(maxLength: 512, nullable: false),
        UpdatedBy = table.Column<string>(maxLength: 512, nullable: false),
        TaskId = table.Column<Guid>(nullable: false)
    },
        constraints: table =>
        {
            table.PrimaryKey("PK_WorkerTaskTargetReference", x => x.Id);
            table.ForeignKey(
                name: "FK_WorkerTaskTargetReference_WorkerTask_TaskId",
                column: x => x.TaskId,
                principalTable: "WorkerTask",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
        });

    migrationBuilder.CreateIndex(
        name: "IX_WorkerTaskTargetReference_TaskId",
        table: "WorkerTaskTargetReference",
        column: "TaskId");

И я не понимаю, что я делаю неправильно.

Какой тип данных WorkerTask.Id Я ожидаю, что это не char(36)

RiggsFolly 17.12.2020 13:59

В моей модели сущности они оба направляющие

heisenberg 17.12.2020 14:01

Это оператор sql, который имеет значение. Пожалуйста, проверьте тип данных поля WorkerTask.Id в mysql.

Shadow 17.12.2020 14:08

Сопоставление: utf8mb4_unicode_ci Идентификатор char(36) PK

heisenberg 17.12.2020 14:11
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
4
4
13 273
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я узнал решение.

Мои таблицы с сопоставлением: utf8mb4_unicode_ci, в то время как моя схема базы данных была с utf8mb4_0900_ai_ci

Я изменил схему сервера по умолчанию на utf8mb4_unicode_ci, и это помогло.

Поскольку они были символами, они отличаются из-за схемы

Приведенный выше ответ не решил это для меня.
В моем случае тип данных столбца referencing был int, и он отличался от столбца referenced, который был bigint ограничением внешнего ключа. Сделав типы данных одинаковыми, я решил эту проблему.

Такой же был мой случай. Спасибо

Rameez Raja 07.09.2021 12:36

можете ли вы добавить способ, которым вы указали тип данных в своей миграции? (добавление :type => :bigint в функцию add_reference)

Flooo49 30.06.2022 14:30

Вопрос помечен Mysql, поэтому у меня была эта проблема в чистом sql, а не в Entity-Framework. Но если вам нужен ответ, попробуйте: stackoverflow.com/questions/32266917/….

Hmerman6006 30.06.2022 15:44

для django я захожу в phpmyadmin и меняю идентификатор на bigint. Эта проблема для django> v.4, потому что они включают bigint для всех полей идентификатора, и если вы обновили django, у вас есть эта проблема. извините за мой английский

JopaBoga 08.12.2022 20:51

@JopaBoga Laravel также начал делать то же самое с версиями выше 7, я полагаю.

Hmerman6006 09.12.2022 07:34

В моем случае атрибут тоже другой.

kunj kanani 22.02.2023 07:20

Другие вопросы по теме