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. 修复已生成的错误迁移
因为你已经生成了不符合预期的迁移文件,需要按以下步骤处理:
- 如果还没将迁移应用到数据库:
- 先删除错误的迁移:执行命令
dotnet ef migrations remove - 重新生成正确的迁移:
dotnet ef migrations add NewTableFixed(名称可以自定义) - 将迁移应用到数据库:
dotnet ef database update
- 先删除错误的迁移:执行命令
- 如果已经将错误迁移应用到数据库:
- 先回滚到错误迁移之前的版本:
dotnet ef database update <上一个迁移的名称>(比如之前的迁移叫InitialCreate,就写这个) - 删除错误的迁移文件:
dotnet ef migrations remove - 重新生成并应用正确的迁移(同上步骤)
- 先回滚到错误迁移之前的版本:
关键注意点
- 如果你原本的
Id是string类型,想要改成自增整数/Guid,因为是新增表,不会有数据迁移的问题;如果是已有数据的表,需要额外处理数据转换。 - EF Core默认不会自动将
string类型的Id设为自动生成主键,所以必须显式配置生成规则。
内容的提问来源于stack exchange,提问作者user6728767
相关产品推荐
相关产品推荐

