Добавление двух сущностей с FK, указывающими друг на друга - PullRequest
0 голосов
/ 22 октября 2010

В моем приложении две таблицы.Первый, разделы, хранит контент для определенного раздела онлайн-публикации.Он содержит (среди прочего) заголовок раздела и поле CurrentRevisionId (FK).

Во второй таблице, Revisions, хранятся различные ревизии этого содержимого.Он имеет поле PK RevisionId (вышеупомянутый FK, используемый для обозначения текущей ревизии), само содержимое HTML и SectionId (FK), указывающее, к какой секции принадлежит ревизия.ФК, указывая друг на друга.Когда я создаю новый раздел, дочерний объект CurrentRevision также заполняется этим содержимым.Но InsertOnSubmit завершается с ошибкой:

Оператор INSERT конфликтует с ограничением FOREIGN KEY "FK_Sections_Revisions".Конфликт произошел в базе данных «xxxx», таблице «xxxx.Sections», столбце «SectionID».Оператор был прерван.

Я предполагаю, что он не может одновременно создавать обе строки и заполнять их PK друг друга.

Если я сначала вставлю Раздел, затемРедакция (вместе с PK раздела), а затем обновить секцию с помощью Revision PK?Или есть лучшее / более элегантное решение для этого?

РЕДАКТИРОВАТЬ: Я приложил скриншот двух таблиц с их отношениями.Каждый раздел имеет много ревизий (FK SectionID внутри таблицы ревизий).Кроме того, существует взаимно-однозначное отношение, когда поле CurrentRevisionId в разделе указывает на ревизию, которая является «текущей».В этой «текущей» ревизии приложение извлекает HTML-код.Надеюсь, это немного прояснит ситуацию.

alt text

Ответы [ 2 ]

2 голосов
/ 22 октября 2010

Вы не можете иметь FK из двух таблиц, указывающих друг на друга;это не имеет смысла.

Если вы пытаетесь смоделировать отношение «многие ко многим», вам необходимо создать таблицу сопоставления между двумя таблицами.Он будет содержать (как минимум) два внешних ключа, по одному на каждый из ваших первичных ключей двух таблиц.

1 голос
/ 22 октября 2010

Если содержимое ревизии хранится в таблице REVISIONS, то я не вижу необходимости иметь поле RevisionID в таблице SECTIONS.

Когда для одной и той же секции создаются разные ревизии, новые строкибыть добавленным в таблицу REVISIONS с FK (SectionID), ссылающимся на таблицу SECTIONS.

SECTIONS: SectionID (PK) |SectionData ..

ПЕРЕСМОТРЫ: RevisionID (PK) | SectionID (FK) |RevisionData ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...