2011-01-20 4 views
1

Привет Я использую самообучающиеся объекты EF 4. У меня есть три таблицы (вопросник, раздел и страница) следующим образом:Проблема с кольцевой ссылкой EF4 при удалении

Questionnaire 
Id 
Title 
WhenClosedShowPageId 

Section 
Id 
QuestionnaireId 

Page 
Id 
SectionId 

Так что в модели EF вопросник имеет разделы и раздел содержит страницы. WhenClosedShowPageId - это значение с нулевым значением int, которое ссылается на страницу, показывающую, когда вопросник закрыт. Все ссылки имеют ассоциации для поддержания ссылочной целостности.

Проблема возникает, когда я отмечаю все объекты как удаленные и пытаюсь сохранить. Если WhenClosedShowPageId было null, когда я извлек данные, тогда удаление будет прекрасным. Если значение параметра WhenClosedShowPageId установлено равным значению, EF не сможет выработать порядок удаления. Это понятно. Однако, если я установил WhenClosedShowPageId равным null, пометьте сущности как удаленные и сохраненные, то же самое произойдет. Я бы ожидал, что EF сначала сгенерирует оператор обновления, чтобы установить WhenClosedShowPageId в значение null в базе данных, а затем для удаления объектов.

Единственный способ, который я вижу, чтобы обойти эту проблему, - это сделать два независимых сейва самостоятельно, первым установить значение WhenClosedShowPageId равным null, а второе - удалить объекты. Это очень многоуровневое приложение, хотя я не хочу создавать специальный случай именно для этого.

Есть ли способ обойти это?

Даррен

ответ

0

Entity Framework будет отбрасывать в ожидании изменений, если объект был помечен для удаления. В конце концов, если вы избавитесь от него, в чем смысл обновления данных в первую очередь? К сожалению, это может привести к тому, что вы видите.

Лучшее решение для вашей проблемы было бы сделать оба конца ассоциации через WhenClosedShowPageId не каскадное удаление (End1 OnDelete и End2 OnDelete набор для None). Поскольку эта страница является частью раздела, входящего в вопросник, он в конечном итоге будет удален в любом случае, поэтому вам не нужно беспокоиться об этом.

Смежные вопросы