You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core插入登录日志失败:预期影响1行实际0行问题求助

问题分析与解决方案

核心问题定位

你遇到的报错本质是EF执行SaveChanges时,预期插入1条记录但数据库实际未写入任何行,触发了乐观并发检测。结合代码场景,用户不存在时插入失败、存在时成功的差异,大概率和LoginActivityModel的实体配置或字段约束有关,而非DbContext本身的问题。

具体排查与修复步骤

1. 检查LoginActivityModel的主键配置

如果你的LoginActivityModel主键未设置自增,EF会默认认为你要手动指定主键值。当插入未赋值主键的实体时,数据库可能拒绝写入,导致影响行数为0。

修改实体类,确保主键配置为自增:

public class LoginActivityModel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 标记主键自增
    public int Id { get; set; }

    public string LoginStatus { get; set; }
    public bool isLockedAccount { get; set; }
    public string Details { get; set; }
    public int? UserID { get; set; } // 改为可空类型,适配用户不存在的场景
    // 其他字段...
}

2. 修正UserID的外键约束(如果存在)

如果LoginActivity表的UserID是外键,关联Users表的Id,那么设置UserID=0会违反外键约束(因为Users表没有ID为0的记录)。此时应将UserID设为null,并确保实体和数据库字段都允许为空。

3. 将插入方法改为异步

你的Authenticate是异步方法,同步调用SaveChanges可能导致上下文状态异常。修改InsertLoginActivity为异步:

public async Task InsertLoginActivity(LoginActivityModel login)
{
    _db.LoginActivity.Add(login);
    try 
    { 
        await _db.SaveChangesAsync(); 
    }
    catch (Exception ex) 
    { 
        throw new Exception(ex.Message); 
    }
}

调用时加上await:

await InsertLoginActivity(login);

4. 移除不必要的并发令牌(如果有)

如果LoginActivityModel中配置了[Timestamp]或[ConcurrencyCheck]属性,且你不需要对登录日志做乐观并发控制,直接移除这些配置。这类字段会让EF在插入后验证行版本,若数据库未正确生成值则会触发报错。

5. 验证数据库表结构

检查LoginActivity表的实际结构:

  • 主键是否设置为自增(比如SQL Server的IDENTITY属性)
  • 所有必填字段是否在插入时都已赋值(比如LoginStatus是否允许为空)
  • 外键约束是否与实体配置匹配

总结

最可能的根源是主键未自增或UserID外键约束冲突,按上述步骤逐一排查即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:06:25