mysql 外键约束“foreign_key”中的引用列“column”和引用列“Id”不兼容

ruoxqz4g  于 12个月前  发布在  Mysql
关注(0)|答案(3)|浏览(479)

我试图使用实体框架生成迁移,但我不断遇到

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");

我不明白我做错了什么。

cgh8pdjw

cgh8pdjw1#

我已经找到解决办法了。
我的表格在哪里与排序:utf8mb4_unicode_ci,而我的数据库模式是utf8mb4_0900_ai_ci
我将默认服务器模式更改为utf8mb4_unicode_ci,它成功了
因为它们是字符,所以它们因模式而不同

flmtquvp

flmtquvp2#

上面的答案并没有解决我的问题。
在我的例子中,referencing列的数据类型是int,这与外键约束中的referencedbigint不同。通过使数据类型相同,为我解决了这个问题。

hyrbngr7

hyrbngr73#

在这里为那些上面的回答可能对他们没有帮助的人发表评论。
在我的例子中,它是不同类型的属性。
引用的属性为:
storeId: { type: DataTypes.INTEGER({ unsigned: true }) }
而引用属性为:
storeId: { type: DataTypes.INTEGER }

相关问题