【问题标题】:Update attempt in .NET Core throws exception.NET Core 中的更新尝试引发异常
【发布时间】: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


【解决方案1】:

您不应该保存stApplications,而是将其中的值映射到您从数据库中提取的application 实例,然后保存application

【讨论】:

    【解决方案2】:

    您必须首先在本地实体中设置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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多