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