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
相关产品推荐
相关产品推荐

