Ответ 1
РЕДАКТИРОВАТЬ: после того, как вы сказали, что нет причин, вот причина. Допустим, у вас есть следующий сценарий:
public class Dog {
public DogLeg StrongestLeg {get;set;}
public IList<DogLeg> Legs {get;set;
}
Если вы сначала хотите удалить, и разрешите удалить все Dog.Legs, вы можете удалить StrongestLeg, что приведет к нарушению ссылки. Следовательно, вы не можете УДАЛИТЬ, прежде чем вы ОБНОВЛЯЕТЕ.
Предположим, вы добавили новую ногу, и что новая нога также является StrongestLeg. Затем вы должны ВСТАВИТЬ перед обновлением, чтобы нога имела идентификатор, который можно вставить в Dog.StrongestLegId.
Итак, вы должны ВСТАВИТЬ, ОБНОВИТЬ, а затем УДАЛИТЬ.
Также как nHibernate основан на Hibernate, я просмотрел Hibernate и обнаружил, что несколько человек говорили о той же проблеме.
- Поддержка ассоциаций списка "один ко многим" с ограничениями для обоих (owner_id, position) и (child_id)
- Ненасыщенные загруженные обновления списка, выполненные в неправильном порядке, вызывают исключение
- неправильный порядок вставки/удаления при обновлении набора записей
- Почему Hibernate выполняет вставки перед удалением?
- Unidirection OneToMany вызывает двойное нарушение ввода ключа при удалении из списка
И вот лучший ответ от них:
Gail Badner добавил комментарий - 21/Feb/08 2:30 PM: Проблема возникает, когда новый объект объединения с генерируемым идентификатором добавляется в коллекцию. Первый шаг при объединении объекта содержащий эту коллекцию, каскад сохранить новую ассоциацию организация. Каскад должен произойти до другие изменения в коллекции. Потому что уникальный ключ для этого нового объект объединения такой же, как сущность, которая уже сохраняется, ConstraintViolationException - это выброшены. Это ожидаемое поведение.