Я пытаюсь создать миграцию, используя структуру сущностей, но я продолжаю натыкаться на
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");
И я не понимаю, что я делаю неправильно.
В моей модели сущности они оба направляющие
Это оператор sql, который имеет значение. Пожалуйста, проверьте тип данных поля WorkerTask.Id в mysql.
Сопоставление: utf8mb4_unicode_ci Идентификатор char(36) PK






Я узнал решение.
Мои таблицы с сопоставлением: utf8mb4_unicode_ci, в то время как моя схема базы данных была с utf8mb4_0900_ai_ci
Я изменил схему сервера по умолчанию на utf8mb4_unicode_ci, и это помогло.
Поскольку они были символами, они отличаются из-за схемы
Приведенный выше ответ не решил это для меня.
В моем случае тип данных столбца referencing был int, и он отличался от столбца referenced, который был bigint ограничением внешнего ключа. Сделав типы данных одинаковыми, я решил эту проблему.
Такой же был мой случай. Спасибо
можете ли вы добавить способ, которым вы указали тип данных в своей миграции? (добавление :type => :bigint в функцию add_reference)
Вопрос помечен Mysql, поэтому у меня была эта проблема в чистом sql, а не в Entity-Framework. Но если вам нужен ответ, попробуйте: stackoverflow.com/questions/32266917/….
для django я захожу в phpmyadmin и меняю идентификатор на bigint. Эта проблема для django> v.4, потому что они включают bigint для всех полей идентификатора, и если вы обновили django, у вас есть эта проблема. извините за мой английский
@JopaBoga Laravel также начал делать то же самое с версиями выше 7, я полагаю.
В моем случае атрибут тоже другой.
Какой тип данных
WorkerTask.IdЯ ожидаю, что это не char(36)