Экземпляр типа сущности «Пользователь» невозможно отследить, поскольку другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа. Рассмотрите возможность использования DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть конфликтующие значения ключей.
Я использую метод обновления удостоверений, и он вызывает это исключение.
Код: Выделить всё
await _userManager.UpdateAsync(user);
Код: Выделить всё
public async Task UpdateAsync(TEntity entity)
{
_dbSet.Update(entity);
_context.Entry(entity).State = EntityState.Modified;
}
Код: Выделить всё
public async Task UpdateAsync(TEntity entity)
{
_dbSet.Attach(entity);
_context.Entry(entity).State = EntityState.Modified;
}
ОБНОВЛЕНИЕ:
Решение заключалось в том, что я попытался связать таблицы из базы данных с основной один (например, категории для пользователей) и работать с ними (что неправильный подход). Вы должны следовать принципу получать только то, что вам нужно в данный момент (если вам нужно обновить категорию, не обязательно делать это через подключенного пользователя). То есть получать из базы только то, что будет обработано. В противном случае это приведет к аналогичным ошибкам. Конкретно этот еще и заключался в том, что мои DTO были настроены не одинаково и хранили там экземпляры одного и того же пользователя, что и вызывало конфликт.
Неправильный DTO:
Код: Выделить всё
class ExampleCategoryDTO
{
public int Id { get; set; }
public string Name { get; set; }
public virtual IList Users { get; set; } --- wrong
}
Код: Выделить всё
var tmp = context.Include(x => x.Categories).Users.ToList();
// Imagine we're changing some "tmp" variable data in categories
context.Update(tmp);
context.SaveChanges();
Подробнее здесь: https://stackoverflow.com/questions/726 ... nstance-wi