Почему появляется ошибка Instance of entity type cannot be tracked because another instance of this type with the same key is already being tracked?
У меня есть метод в репозитории, который изменяет значение одного поля, перед этим проверив наличие ентити:
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. Поэтому первый вариант не подходит.
Источник: Stack Overflow на русском