You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.Net Core 2+EF Core+MySQL新增数据失败,仅更新ID=1数据

解决ASP.NET Core 2 + EF Core + MySQL下Employee实体无法新增、仅更新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的自增配置,需要重新生成:

  1. 删除项目中Migrations文件夹下的所有旧迁移文件(可保留YourDbContextModelSnapshot.cs,也可全部删除后重新生成)
  2. 在Package Manager Console中执行:
    Add-Migration InitialEmployeeSetup -Context YourDbContextName
    Update-Database -Context YourDbContextName
    
  3. 登录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

火山引擎 最新活动