You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至Pomelo 5.0.3后迁移脚本自动生成错误排序规则问题

问题原因

Pomelo 5.x版本为了优化Guid类型的存储和查询性能,默认会给char(36)类型的Guid字段自动添加ascii_general_ci的排序规则。当你关联的主表主键字段(此处为Users.Id)使用的是数据库默认的排序规则(通常是utf8mb4系列)时,两个关联字段的排序规则不一致就会触发外键创建失败的报错。

可用的更优解决方案

方案1:全局禁用Guid默认排序规则配置

如果你希望所有Guid字段都沿用数据库的默认排序规则,可以在注册DbContext时直接关闭Pomelo的Guid字符集自动配置特性:

services.AddDbContext<你的DbContext类名>(options =>
    options.UseMySql(连接字符串, 你的数据库版本实例,
        mysqlOpt =>
        {
            // 关闭Guid类型默认的ascii字符集与排序规则绑定
            mysqlOpt.DisableGuidCharSetSupport();
            // 其他原有配置保持不变
        }));

这个方案改动最小,生效后新生成的迁移文件就不会自动追加collation: "ascii_general_ci"配置。

方案2:显式指定外键字段的排序规则

如果你只需要修正个别字段的排序规则,不需要全局改动,可以在对应实体的配置里手动指定和主表主键一致的排序规则:

public override void Configure(EntityTypeBuilder<MyTableEntity> builder)
{
    base.Configure(builder);
    
    // 新增这行,排序规则替换为你Users表Id字段实际使用的规则即可
    builder.Property(x => x.UserId)
        .UseCollation("你的数据库默认排序规则,比如utf8mb4_general_ci");

    builder.HasOne(x=> x.User)
        .WithMany()
        .HasForeignKey(x=> x.UserId)
        .HasPrincipalKey(user => user.Id);
}

方案3:全局配置模型默认排序规则

如果你的整个数据库所有表都使用统一的排序规则,可以直接在模型创建时指定全局默认排序规则,优先级高于Pomelo的默认Guid配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 替换为你数据库实际的默认排序规则
    modelBuilder.UseCollation("utf8mb4_general_ci");
    
    // 其他原有配置保持不变
}

以上任意一种方案配置完成后,重新生成迁移文件即可自动避免错误排序规则的生成,不需要再手动修改迁移代码。


内容的提问来源于stack exchange,提问作者Ben5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:45:09