0

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
4

1 に答える 1

0

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

于 2012-03-29T20:04:18.460 に答える