Некоторые из объектов в нашей настройке имеют уникальные индексы, и они проверяются на бэкэнде с помощью блока try catch, чтобы посмотреть, сработало ли сохранение.
try
{
await context.MyUniqueEntity.AddAsync(myUniqueEntity);
var rows = await context.SaveChangesAsync();
return rows > 0 ? myUniqueEntity : null;
}
catch (DbUpdateException ex)
{
context.Entry(myUniqueEntity).State = EntityState.Detached;
throw new Exception("You must provide a unique name", ex.InnerException);
}
Это хорошо для добавления объектов всистема, как указано выше.Однако, когда дело доходит до обновления, блок catch выглядит следующим образом:
context.Entry(myUniqueEntity).State = EntityState.Unchanged;
throw new Exception("You must provide a unique name", ex.InnerException);
И это тоже хорошо работает - один раз.Если пользователь дважды сталкивается с одной и той же проблемой с одним и тем же объектом, это происходит:
Не удается отследить экземпляр типа сущности 'MyUniqueEntity', поскольку другой экземпляр с таким же значением ключа для {'Id '} уже отслеживается.При подключении существующих объектов убедитесь, что подключен только один экземпляр объекта с данным значением ключа.
Это веб-система, поэтому я не могу действительно остановить свежую копию объекта, извлекаемого каждый раз.И я полагаю, что я мог бы исправить это, получив свежую копию контекста, вместо того чтобы пытаться отбрасывать изменения каждый раз, но я бы предпочел не идти по этому пути.
Есть ли другой способ исправить этот сценарий