Отношения "многие ко многим" в определенном столбце для Entity Framework

У меня есть 3 таблицы: Книга, Раздел и Содержание. Я хочу добавить отношение «многие ко многим» между разделом и содержимым. В таблицах Section и Content есть столбец PageNo. Страница может иметь много содержимого и много разделов. Вкратце:

Book 1----* Section (on BookId)
Book 1----* Content (on BookId)
Section *-----* Content (on PageNo)

Номер страницы не уникален как для разделов, так и для таблиц содержимого. Поэтому я не могу добавить внешний ключ для PageNo в Sql Server.

Я попытался создать соединительную таблицу следующим образом:

SectionContent: [SectionId, ContentId]

И я добавил FK для этой соединительной таблицы. Таким образом, структура сущностей могла понимать соединительную таблицу и устанавливать отношения «многие ко многим» для SectionId и ContentId. Но каждый раз, когда мне нужно вставить один из разделов или таблиц содержимого, я также должен вставить в соединительную таблицу SectionContent. Итак, сначала я должен проверить, есть ли такая же запись в таблице соединений. Также в проекте много операций вставки. Мне нужно искать все операции вставки, и мне нужно добавить дополнительный запрос для вставки в соединительную таблицу.

Также мне нужно получить разделы и содержимое на странице. Это дополнительные усилия для меня.

Я могу удалить связь между таблицами Section и Content. И я могу использовать дополнительные запросы на соединение в столбце PageNo. Но я хочу использовать сущность. Я хочу получить содержимое таким же образом, как Section.Contents, и я хочу получить разделы так же, как Content.Sections.

Итак, могу ли я добавить связь «многие ко многим» между Section и Content в столбце PageNo без FK SQL Server?

Изменить: также, если я использую приведенную выше соединительную таблицу, я должен выполнить такой SQL-запрос, не так ли?

INSERT INTO SectionContent
SELECT * FROM 
(
    SELECT Section.id AS SectionId, Content.id AS ContentId
    FROM Section
    LEFT OUTER JOIN Content
        ON Section.PageNo = Content.PageNo AND 
           Section.BookId = Content.BookId 

    UNION

    SELECT Section.id AS SectionId, Content.id AS ContentId
    FROM Section
    RIGHT OUTER JOIN Content
        ON Section.PageNo = Content.PageNo AND 
           Section.BookId = Content.BookId 
) AS T
WHERE SectionId is not NULL AND ContentID is not NULL
GROUP BY T.SectionId, T.ContentId

comment
У меня есть обходной путь. Но это еще не практичное решение. Я создал таблицу страниц, в которой есть столбцы id, BookId, PageNo. И я удалил столбцы PageNo из таблиц Section и Content. Также я добавил новый столбец с именем PageId, который относится к столбцу id таблицы Page.   -  person oruchreis    schedule 25.12.2011


Ответы (1)


Я решил эту проблему, используя EF Code First. Я реализовал все таблицы как класс, а EF обрабатывал все отношения «многие ко многим».

person oruchreis    schedule 29.03.2012