Почему появляется ошибка Instance of entity type cannot be tracked because another instance of this type with the same key is already being tracked?

Рейтинг: 0Ответов: 0Опубликовано: 12.04.2023

У меня есть метод в репозитории, который изменяет значение одного поля, перед этим проверив наличие ентити:

public async Task<Post?> DeleteAsync(Guid id)
{
    var entity = await context.Posts.FindAsync(id);
    if (entity is null) return null;
    
    entity.Status = Statuses.Deleted;

    await using var transaction = await context.Database.BeginTransactionAsync();
    await transaction.CreateSavepointAsync("transaction");
    try
    {
        await context.SaveChangesAsync();
        await transaction.CommitAsync();
        return mapper.Map<Post>(entity);
    }
    catch (Exception)
    {
        await transaction.RollbackToSavepointAsync("transaction");
        return default;
    }
}

Насколько корректно делать проверку на null на entity уровне? У меня есть ещё менеджер постов, который как раз вызывает метод DeleteAsync и кажется, что лучше в нём сделать получение модельки из базы, потом передать её в DeleteAsync, смапить модельку в ентити и произвести изменения. Как-то так:

// слой менеджера
public async Task<Post?> DeleteAsync(Guid postId)
{
    var post = await postsRepository.GetAsync(postId);
    if (post is null) return null;
    
    return await postsRepository.DeleteAsync(post);
}

// слой entity
public async Task<Post?> DeleteAsync(Post post)
{
    var entity = mapper.Map<PostEntity>(post);
    entity.Status = Statuses.Deleted;

    await using var transaction = await context.Database.BeginTransactionAsync();
    await transaction.CreateSavepointAsync("transaction");
    try
    {
        await context.SaveChangesAsync();
        await transaction.CommitAsync();
        return mapper.Map<Post>(entity);
    }
    catch (Exception)
    {
        await transaction.RollbackToSavepointAsync("transaction");
        return default;
    }
}

Но в таком случае появляется ошибка:

The instance of entity type cannot be tracked because another instance of this type with the same key is already being tracked

Её можно как-то поправить, чтобы использовать второй вариант?

Я тут первый вариант с одной проверкой на null показал, но в проекте есть метод, где 3 разные проверки. И, кажется, что это уже метод проверки на null, а не на обновление свойства entity. Поэтому первый вариант не подходит.

Ответы

Ответов пока нет.