Попытка обновления в .NET Core выдает исключение - PullRequest
0 голосов
/ 30 сентября 2019

Я занимаюсь разработкой приложения, в котором не обязательно использовать идентификатор ядра .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});
}

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Вы не должны сохранять stApplications, а скорее сопоставлять значения из этого значения с application экземпляром, который вы извлекли из базы данных, а затем сохранять application.

0 голосов
/ 30 сентября 2019

Сначала необходимо установить объект 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...