对一个或多个实体的验证失败
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”属性。