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

Entity Framework迁移报错:新增SQL Server表生成迁移文件后遇异常

解决EF Core迁移中新增表主键未自动生成的问题

看起来你遇到的核心问题是:EF Core生成的迁移文件里,InboxNotifications表的Id被定义成了nvarchar(450)类型的普通主键,而非你期望的自动生成(自增整数/自动Guid)主键。这通常是因为实体类的Id属性没有正确配置EF Core的主键生成规则导致的,下面是具体的解决步骤:

1. 检查并修正实体类的Id属性配置

首先要确保你的InboxNotification实体类里,Id属性加上了正确的数据注解,或者通过Fluent API配置了自动生成规则:

选项1:使用数据注解(推荐快速配置)

根据你想要的主键类型选择:

  • 自增整数主键(最常用):
public class InboxNotification
{
    // 标记为主键,并指定数据库自动生成值
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    
    public DateTime Created { get; set; }
    public string CreatedBy { get; set; }
    // 其他属性...
}
  • 自动生成Guid主键(适合分布式场景):
public class InboxNotification
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    
    public DateTime Created { get; set; }
    public string CreatedBy { get; set; }
    // 其他属性...
}

选项2:使用Fluent API(适合复杂配置)

如果习惯在DbContext的OnModelCreating方法里统一配置实体,可添加如下代码:

  • 自增整数主键(SQL Server专用):
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<InboxNotification>()
        .HasKey(n => n.Id); // 标记Id为主键
    modelBuilder.Entity<InboxNotification>()
        .Property(n => n.Id)
        .ValueGeneratedOnAdd() // 新增时自动生成值
        .UseIdentityColumn(); // 使用SQL Server的自增列特性
}
  • 自动Guid主键(SQL Server会自动用NEWSEQUENTIALID()生成):
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<InboxNotification>()
        .HasKey(n => n.Id);
    modelBuilder.Entity<InboxNotification>()
        .Property(n => n.Id)
        .ValueGeneratedOnAdd()
        .HasDefaultValueSql("NEWSEQUENTIALID()"); // 指定SQL Server的自动生成函数
}

2. 修复已生成的错误迁移

因为你已经生成了不符合预期的迁移文件,需要按以下步骤处理:

  • 如果还没将迁移应用到数据库:
    1. 先删除错误的迁移:执行命令 dotnet ef migrations remove
    2. 重新生成正确的迁移:dotnet ef migrations add NewTableFixed(名称可以自定义)
    3. 将迁移应用到数据库:dotnet ef database update
  • 如果已经将错误迁移应用到数据库:
    1. 先回滚到错误迁移之前的版本:dotnet ef database update <上一个迁移的名称>(比如之前的迁移叫InitialCreate,就写这个)
    2. 删除错误的迁移文件:dotnet ef migrations remove
    3. 重新生成并应用正确的迁移(同上步骤)

关键注意点

  • 如果你原本的Id是string类型,想要改成自增整数/Guid,因为是新增表,不会有数据迁移的问题;如果是已有数据的表,需要额外处理数据转换。
  • EF Core默认不会自动将string类型的Id设为自动生成主键,所以必须显式配置生成规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:26:58