升级至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
相关产品推荐
相关产品推荐

