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

.NET Core 6迁移Identity表时NormalizedName字段报错排查

解决.NET Core 6 Identity迁移中NormalizedName字段的BLOB/TEXT键长度错误

这个错误是MySQL特有的——哪怕你给NormalizedName字段设置了maxLength:256,Identity框架默认会给这个字段创建唯一索引,而MySQL要求TEXT/BLOB类型字段建索引时必须指定索引长度,EF Core自动生成的迁移代码里没给索引加这个配置,所以才会报错。

具体解决方法:

方法1:直接修改迁移文件

找到迁移文件中创建RoleNameIndex的代码段,给索引加上MySQL专属的索引长度注解:

// 原迁移代码(有问题)
migrationBuilder.CreateIndex(
    name: "RoleNameIndex",
    table: "AspNetRoles",
    column: "NormalizedName",
    unique: true,
    filter: "[NormalizedName] IS NOT NULL");

// 修改后的代码
migrationBuilder.CreateIndex(
    name: "RoleNameIndex",
    table: "AspNetRoles",
    column: "NormalizedName",
    unique: true,
    filter: "[NormalizedName] IS NOT NULL")
    .Annotation("MySql:IndexPrefixLength", new[] { 256 });

方法2:在DbContext中提前配置(一劳永逸)

在你的IdentityDbContext子类的OnModelCreating方法里,重写角色实体的配置,确保索引长度被正确设置:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    // 配置IdentityRole的NormalizedName索引
    builder.Entity<IdentityRole>(role =>
    {
        role.Property(r => r.NormalizedName)
            .HasMaxLength(256);

        role.HasIndex(r => r.NormalizedName)
            .IsUnique()
            .HasFilter("[NormalizedName] IS NOT NULL")
            .HasAnnotation("MySql:IndexPrefixLength", 256);
    });

    // 如果用户表的NormalizedUserName也报同样错误,用同样方式配置IdentityUser
    builder.Entity<IdentityUser>(user =>
    {
        user.Property(u => u.NormalizedUserName)
            .HasMaxLength(256);

        user.HasIndex(u => u.NormalizedUserName)
            .IsUnique()
            .HasFilter("[NormalizedUserName] IS NOT NULL")
            .HasAnnotation("MySql:IndexPrefixLength", 256);
    });
}

额外注意

确保你使用的MySQL EF Core提供程序版本和.NET Core 6兼容,比如使用Pomelo.EntityFrameworkCore.MySql 6.x版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:15:32