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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对一个或多个实体的验证失败相关的知识,希望对你有一定的参考价值。

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

我有一个使用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;
答案

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

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)
    };

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

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

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

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

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

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

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