首页 > 解决方案 > .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});
}

标签: c#asp.net-coreentity-framework-core

解决方案


您必须首先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;
    }

推荐阅读