使用Entity Framework Core将.NET Core Identity模型迁移到SQLite时,ConcurrencyStamp字段出现nvarchar(max)语法错误的解决方法
Entity Framework Core将.NET Core Identity模型迁移到SQLite时,ConcurrencyStamp字段出现nvarchar(max)语法错误的解决方法
这个问题我之前也碰到过!根源在于SQLite并不支持SQL Server风格的nvarchar(max)类型,它用TEXT来存储任意长度的文本,但EF Core生成的迁移脚本错误地给ConcurrencyStamp字段用了nvarchar(max),导致SQLite抛出语法错误。
下面是具体的解决步骤:
1. 调整实体配置,指定ConcurrencyStamp为TEXT类型
你需要在DbContext的OnModelCreating方法中,覆盖Identity角色实体的ConcurrencyStamp字段类型配置。这样EF Core生成迁移时就会使用SQLite兼容的TEXT类型:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 先调用Identity的默认配置,避免覆盖其他默认设置 base.OnModelCreating(modelBuilder); // 针对IdentityRole的ConcurrencyStamp字段指定TEXT类型 modelBuilder.Entity<IdentityRole>() .Property(role => role.ConcurrencyStamp) .HasColumnType("TEXT"); // 如果你的项目用了自定义的Role类,替换成自己的类名即可 // modelBuilder.Entity<CustomRole>() // .Property(role => role.ConcurrencyStamp) // .HasColumnType("TEXT"); }
如果你更倾向于用数据注解,也可以通过partial类扩展IdentityRole(因为Identity的实体类都是partial的):
public partial class IdentityRole { [Column(TypeName = "TEXT")] public override string ConcurrencyStamp { get; set; } }
2. 重新生成并应用迁移
之前的迁移脚本已经生成了错误的SQL语句,需要先移除它,再重新生成正确的版本:
Package Manager Console(Visual Studio):
Remove-Migration Add-Migration CreateIdentitySchemaFixed Update-Database.NET CLI:
dotnet ef migrations remove dotnet ef migrations add CreateIdentitySchemaFixed dotnet ef database update
验证效果
重新生成的迁移脚本中,ConcurrencyStamp字段的定义会变成:
"ConcurrencyStamp" TEXT NULL
这下SQLite就能正确执行创建表的语句了。
本质上,这个问题是因为Identity的默认配置是针对SQL Server优化的,当切换到SQLite这种类型系统更简单的数据库时,需要手动调整字段的类型映射,确保EF Core生成兼容的SQL语句。
备注:内容来源于stack exchange,提问作者Ortund
相关产品推荐
相关产品推荐

