c# - .NET Core 中的更新尝试引发异常
问题描述
我正在开发一个应用程序,我不一定需要使用 .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});
}
解决方案
您必须首先Detached
在本地实体中设置对象,然后Modified
在新对象上设置状态。
public virtual async Task UpdateAsync(TEntity entity, CancellationToken cancellationToken, bool saveNow = true)
{
Assert.NotNull(entity, nameof(entity));
AttachEntity(entity);
Entities.Update(entity);
if (saveNow)
await DbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
}
private void AttachEntity(TEntity entity)
{
var local = Entities.Local.FirstOrDefault(c => c.Id == entity.Id);
if (local != null)
{
DbContext.Entry(local).State = EntityState.Detached;
}
Entities.Attach(entity);
DbContext.Entry(entity).State = EntityState.Modified;
}
推荐阅读
- javascript - 想要检索 cookie 值
- google-apps-script - 将参数从对话框传递到服务器端脚本
- javascript - React Native - 如何将数组映射数据传递到其他屏幕
- c# - Master.aspx 上的会话为空
- c# - 我应该设置哪些 cookie/标题?
- python - 我可以要求开发人员在将代码提交到 gitlab 之前包含方法文档字符串吗?
- javascript - 如何在 javascript 中为 innerHTML 添加 WP 主题 css
- python - 在新选项卡中打开“href”变量
- javascript - 如何动态更改 Vuex 存储值
- c# - 在 WPF 中使用 Prism 7 加载应用程序时导航到默认视图