Book、Section、Content の 3 つのテーブルがあります。セクションとコンテンツの間に多対多の関係を追加したい。Section テーブルと Content テーブルには PageNo 列があります。ページには、多くのコンテンツと多くのセクションが含まれる場合があります。簡単に:
Book 1----* Section (on BookId)
Book 1----* Content (on BookId)
Section *-----* Content (on PageNo)
PageNo は、Section テーブルと Content テーブルの両方で一意ではありません。そのため、Sql Server で PageNo の外部キーを追加できません。
次のようなジャンクションテーブルを作成しようとしました:
SectionContent: [SectionId, ContentId]
そして、このジャンクション テーブルに FK を追加しました。したがって、エンティティ フレームワークはジャンクション テーブルを理解でき、SectionId と ContentId で多対多の関係を設定できます。しかし、セクションまたはコンテンツ テーブルのいずれかを挿入する必要があるたびに、SectionContent ジャンクション テーブルにも挿入する必要があります。最初に、ジャンクション テーブルに同じレコードが既に存在するかどうかを確認する必要があります。また、プロジェクトには多くの挿入操作があります。すべての挿入操作を検索する必要があり、追加のクエリを追加してジャンクション テーブルに挿入する必要があります。
また、ページのセクションとコンテンツを取得する必要があります。これは私にとって余分な努力です。
Section テーブルと Content テーブルの間の関係を削除できます。また、PageNo 列で追加の結合クエリを使用できます。しかし、私はエンティティを使いたいです。Section.Contents のようにエンティティの方法で Contents を取得したいし、Content.Sections のように同じ方法で Sections を取得したい。
SQL Server の FK を使用せずに、PageNo 列のセクションとコンテンツの間に多対多の関連付けを追加できますか?
編集: また、上記のジャンクション テーブルを使用する場合、このような 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