.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
相关产品推荐
相关产品推荐

