You need to enable JavaScript to run this app. EF Core调用SaveChanges未成功新增数据库记录问题求助
优惠活动
大模型
产品
解决方案
定价
更多

EF Core调用SaveChanges未成功新增数据库记录问题求助

问题根因

EF Core 对int类型的单主键默认配置为自增(Identity)列,会认为主键值由数据库生成,插入时会忽略你手动给XId赋的值,生成的INSERT语句不会携带XId字段,就会出现两种符合你描述的现象:

  • 若表的XId列实际设置了自增:数据库会自动生成自增ID插入,你手动传的ID不会生效,自然查不到对应ID的记录,EF认为插入成功,实体状态变为Unchanged
  • 若表的XId列没有设置自增:若数据库未开启严格模式,会默认插入0作为主键值,后续相同操作会触发主键冲突,但你当前只打印ex.Message会漏掉内层的异常详情,看起来像没有报错。
解决方法

你需要显式配置EF Core,告知该主键不需要数据库生成值,两种配置方式二选一即可:

方式1:数据注解配置

在实体类的主键属性上添加DatabaseGenerated特性:

using System.ComponentModel.DataAnnotations.Schema;

public partial class XSavedList
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int XId { get; set; }
}

方式2:Fluent API配置

在你xContext的OnModelCreating方法中添加配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<XSavedList>()
        .Property(p => p.XId)
        .ValueGeneratedNever();
}
额外排查建议
  • 把异常捕获的打印逻辑改成Console.WriteLine(ex.ToString());,可以输出完整的异常堆栈和内层异常信息,避免漏掉主键冲突、约束错误等隐含问题
  • 可以在上下文配置中开启SQL日志打印,确认生成的INSERT语句是否携带了XId字段:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseMySql("你的数据库连接串", MySqlServerVersion.LatestSupportedServerVersion)
        .LogTo(Console.WriteLine); // 执行SQL会打印到控制台
}
  • 确认数据库连接字符串指向的是你查询的目标库,避免连错环境导致找不到插入的记录
  • 多线程调用场景下建议先查询对应ID是否存在再插入,避免主键冲突异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 01:09:03