В Entity Framework есть несколько условий, которые обрабатываются на уровне базы данных и передаются обратно в EF как исключения в Context.SaveChanges ().
Если вы выполняете создание новых объектов в цикле, вы можете обработать исключение через стандартный блок Try Catch, но как очистить проблемный объект из очереди SaveChanges ()?
Например (перемещение SaveChanges за пределы цикла не имеет положительного эффекта, поэтому оно показано здесь внутри цикла):
while(i < 1000)
{
MyEntity Wibble = new MyEntity();
Wibble.Name = "Test " + i.ToString();
Context.AddToTests(Wibble);
Context.SaveChanges();
}
Если по какой-то причине уже существует Wibble, который вызывает сбой вставки для уникального ограничения в базе данных, я могу обработать немедленное исключение в цикле.
Однако на следующей итерации он снова завершается ошибкой, поскольку проблемный экземпляр Wibble все еще существует в очереди SaveChanges - как вы должны это обрабатывать?
Вы, конечно, можете заранее проверить, создаем ли мы дублирующиеся Wibble, но это приводит к двум обратным поездкам в базу данных. Я не возражаю против обработки исключения, я просто хочу, чтобы о проблеме узнали, проигнорировали эту запись и продолжили.
Мысли? Я делаю это неправильно?
EDIT:
Я решил непосредственную проблему, но только для случаев, когда вы выполняете Context.SaveChanges () в цикле. Если вы просто вызываете SaveChanges () один раз, вне конца цикла, мое решение не работает - кто-нибудь может предложить альтернативный метод, который будет работать?