一个或多个实体问题的验证失败

Posted

技术标签:

【中文标题】一个或多个实体问题的验证失败【英文标题】:Validation failed for one or more entities issue 【发布时间】:2020-02-02 10:38:01 【问题描述】:

这确实是我遇到的最奇怪的问题之一。

我有一个使用 EF 的 Web API。我有一个带有 ApplicationUser 的审计表。我创建新对象,将其添加到集合中,然后调用 SaveChangesAsync()。奇怪的是,我得到“用户名 MyUserName 已被占用”。错误。

using (var context = new ApplicationDbContext())

    var user = context.Users.Single<ApplicationUser>(x => x.UserName == model.UserName);

    var sid = context.SessionIds.FirstOrDefault(x => x.Id == model.SessionId);

    var audit = new Audit
    
        Data = model.Data,
        User = user,
        IpAddress = Helper.GetClientIp(Request),
        Session = sid != null ? sid : ItsMyChance.Entities.Entities.SessionId.Create(scoreModel.UserName, scoreModel.GameId)
    ;

    context.Audits.Add(audit);
    await context.SaveChangesAsync();

更新

此代码已运行多年。不同的是我从 .NET 4.5 升级到 .NET 4.61

更新 2

我也尝试了以下方法,但仍然收到相同的错误

    [ForeignKey("User")]
    public string UserId  get; set; 

    public ApplicationUser User  get; set; 

更新 3

我打电话试图追踪这个问题

var entries = context.ChangeTracker.Entries();

它返回多个条目,每个对象 1 个,包括用户。用户显示已添加,另一个显示为未更改。我不知道这是怎么回事。

另外,我在进行任何更改之前添加了以下内容,但没有效果。

context.Configuration.AutoDetectChangesEnabled = false;

【问题讨论】:

【参考方案1】:

由于您在 Audit 中添加了完整的用户对象,因此 SaveChangesAsync 还将为 Audit 和 User 保存一个新条目,并且由于已经存在具有相同用户名的用户,这就是您收到此错误的原因。您应该做的只是在 Audit 对象中分配 UserId(无论是 Audit 表中 User 的引用键)

var audit = new Audit
    
        Data = model.Data,
        UserId = user.Id,
        IpAddress = Helper.GetClientIp(Request),
        Session = sid != null ? sid : ItsMyChance.Entities.Entities.SessionId.Create(scoreModel.UserName, scoreModel.GameId)
    ;

【讨论】:

代码已经运行多年。我从 .NET 4.5 升级到 4.61,现在它不起作用。我很确定 EF 知道集合中已经存在该用户,因此尝试创建一个新用户是没有意义的。

以上是关于一个或多个实体问题的验证失败的主要内容,如果未能解决你的问题,请参考以下文章

对一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性

实体框架中一个或多个实体的可空布尔属性验证失败

对一个或多个实体的验证失败

一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性

对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。

对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。