0

ブック、セクション、およびコンテンツの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 
+0

回避策があります。しかし、まだ実用的な解決策ではありません。 id、BookId、PageNo列を持つPageテーブルを作成しました。セクションとコンテンツの表からPageNo列を削除しました。また、Pageテーブルのidカラムに関連するPageIdという名前の新しいカラムを追加しました。 – oruchreis

答えて

0

私はこの問題をEF Code Firstを使用して解決しました。すべてのテーブルをクラスとして実装し、EFはすべての多対多の関係を処理しました。

関連する問題