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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 12:17:35