ブック、セクション、およびコンテンツの3つのテーブルがあります。セクションとコンテンツの間に多対多の関係を追加したいと思います。セクションテーブルとコンテンツテーブルにPageNo列があります。ページには多くの内容と多くのセクションがあるかもしれません。概要:Entity Frameworkの特定の列の多対多の関係
Book 1----* Section (on BookId)
Book 1----* Content (on BookId)
Section *-----* Content (on PageNo)
PageNoはセクションテーブルとコンテンツテーブルの両方で一意ではありません。だから私はSql ServerでPageNoの外部キーを追加することはできません。
私はこのような接合テーブルを作成しようとしました:
SectionContent: [SectionId, ContentId]
そして私は、このジャンクションテーブルのFKSを追加しました。したがって、エンティティフレームワークはジャンクションテーブルを理解でき、SectionIdとContentIdに多対多の関係を設定します。しかし、セクションまたはコンテンツテーブルのいずれかを挿入する必要があるたびに、SectionContentジャンクションテーブルにも挿入する必要があります。最初にジャンクション・テーブルにすでに同じレコードがあるかどうかを確認する必要があります。また、プロジェクトには多くの挿入操作があります。私はすべての挿入操作を検索する必要があり、私はジャンクションテーブルに挿入するために余分なクエリを追加する必要があります。
また、ページ内のセクションと内容を取得する必要があります。これは私のための余分な努力です。
セクションテーブルとコンテンツテーブルの関係を削除できます。また、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
回避策があります。しかし、まだ実用的な解決策ではありません。 id、BookId、PageNo列を持つPageテーブルを作成しました。セクションとコンテンツの表からPageNo列を削除しました。また、Pageテーブルのidカラムに関連するPageIdという名前の新しいカラムを追加しました。 – oruchreis