ASP.Net Core 2+EF Core+MySQL新增数据失败,仅更新ID=1数据
看起来你遇到的核心问题是EF Core没有正确识别MySQL的自增主键配置,导致每次Add操作都被当成了对ID=1实体的更新。下面是一步步的解决方案:
1. 确认MySQL EF Core Provider版本兼容
ASP.NET Core 2.x对应的EF Core版本是2.x,你需要使用Pomelo.EntityFrameworkCore.MySql 2.x系列版本(比如2.2.6),版本不匹配会导致很多配置不生效。可以在NuGet包管理器中检查并调整版本。
2. 正确配置实体的自增主键(推荐用Fluent API)
MySQL的自增列需要EF Core明确指定使用MySQL的Identity特性,数据注解有时候会因为provider的兼容问题失效,改用Fluent API更可靠:
在你的DbContext的OnModelCreating方法中,替换原来的配置为:
modelBuilder.Entity<Employee>(entity => { // 明确设置主键 entity.HasKey(e => e.Id); // 配置Id为MySQL自增列(Pomelo provider专属扩展方法) entity.Property(e => e.Id) .UseMySqlIdentityColumn() .ValueGeneratedOnAdd(); });
如果坚持用数据注解,确保同时添加[Key]和[DatabaseGenerated(DatabaseGeneratedOption.Identity)]:
public class Employee { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required] public string Name { get; set; } [Required] public string City { get; set; } [Required] public string Department { get; set; } [Required] public int Salary { get; set; } }
3. 重新生成迁移并更新数据库
之前的迁移文件可能没有正确生成MySQL的自增配置,需要重新生成:
- 删除项目中
Migrations文件夹下的所有旧迁移文件(可保留YourDbContextModelSnapshot.cs,也可全部删除后重新生成) - 在Package Manager Console中执行:
Add-Migration InitialEmployeeSetup -Context YourDbContextName Update-Database -Context YourDbContextName - 登录MySQL数据库,检查
Employee表的结构,确认Id字段的定义是:
并且该字段被设置为主键。`Id` int(11) NOT NULL AUTO_INCREMENT,
4. 排查代码中的实体跟踪问题
如果上面的步骤都做了还是有问题,检查控制器代码中是否意外跟踪了ID=1的Employee实体。比如有没有在Add新实体之前执行过var existing = _context.Employee.Find(1);这类操作,导致上下文已经跟踪了旧实体,SaveChanges时误更新?
可以在Add新实体前加一行代码排查:
// 检查是否有已跟踪的ID=1实体,有则解除跟踪 var tracked = _context.ChangeTracker.Entries<Employee>().FirstOrDefault(e => e.Entity.Id == 1); if(tracked != null) { _context.Entry(tracked.Entity).State = EntityState.Detached; } _context.Employee.Add(employee); _context.SaveChanges();
额外提示
你的代码中用DateTime.UtcNow.Millisecond给Salary赋值,这个值范围是0-999,如果Salary是实际工资金额,建议改用decimal类型更合适哦。
内容的提问来源于stack exchange,提问作者IT Eng - BU




