【发布时间】:2019-10-12 16:11:08
【问题描述】:
我正在开发一个应用程序,我不一定需要使用 .NET 核心身份进行登录。但是,每当我尝试更新记录时,它都会引发以下异常
无法跟踪实体类型“StApplications”的实例,因为已经在跟踪具有相同键值 {'ApplicationId'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。
Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap.ThrowIdentityConflict(InternalEntityEntry 条目)
StApplications是我要更新记录的表
下面是我ApplicationRepository中的代码
public async Task<StApplications> UpdateAsync(StApplications obj)
{
var updatedApplication = _context.Update(obj);
await _context.SaveChangesAsync();
return updatedApplication.Entity;
}
后面是我ApplicationController中的代码,POST方法
public async Task<IActionResult> Biodata(StApplications stApplications)
{
var application = await _ApplicationRepository.GetByIdAsync(stApplications.ApplicationId) ;
if (application == null)
{
return BadRequest(ModelState);
}
var updatedapplication = await _ApplicationRepository.UpdateAsync(stApplications);
return RedirectToAction("Olevel", new { id = updatedapplication.ApplicationId});
}
【问题讨论】:
-
错误信息很清楚,问题出在哪里?显然,在您的代码中,您正在检索对象,然后尝试更新 new 实例(使用相同的键)。您必须使用现有实例或分离先前的实例,或使用 EF 的
Attach方法 -
我认为 POST 方法中存在错误。 stApplications 不在您的上下文中。 application 会是,但代码对它没有任何作用。您似乎也误解了 ModelState,因为当找不到 DB 条目时,它似乎没什么用。
标签: c# asp.net-core entity-framework-core