2009-09-02 4 views
6

これまでLINQは非常に洗練されていましたが、基本的なm2mクエリを実行するためには、私が直面することができる解決策はありません。LINQの多対多の関係:ソリューションですか?

他のテーブル関係では機能しますが、LINQは私のm2mテーブルのクラス構造に関連付けを与えていません。

だから私は

artwork.artists.where(...) 
//or 
artist.Artworks.add(artwork) 

のようなものを行うことができますが、私は

artwork.artowrks_subjects.tagSubjects.where(...) 
//or 
tagSubject.artworks_subjects.add(artwork) 

alt text http://img299.imageshack.us/img299/257/20090902122107.png

を行うことができないこの制限を解決するための一般的なパターンはありますか?

+0

何らかの理由で、m2mが私に汚れているように聞こえます。 ) – TJB

答えて

3

解決方法を自分で見つけました。自動リレーションシップが機能するには、両方のテーブルにプライマリキー(oops)が必要です。注意artworks_subjectsにPKシンボルがありません。

2

これは主に使用しているフレームワークによって異なります。 のように、LINQ-to-SQLのように、非常にのオブジェクトに対するテーブルについてのリテラルです。 Entity Frameworkでは、多対多の組み込みサポートがあります(特に、追加のプロパティを持たないリンクテーブル)。 EFは一般的にこのパターンを見つけ出し、概念モデルからリンクテーブルを隠す(私は覚えていないが、2つのFKカラムにわたってスパニングPKを必要とするかもしれない)。

もちろん、リンクテーブルに列を追加する場合は、これがうまくいきません。だから私はそれを「そのまま」残すように誘惑されることがあります。

についてはwhereなどとはどういう意味ですか?あなたは協会に参加することができ、Anyなどを使用できるはずです。あなたがしたいことの具体的な例がありますか?

+0

かなり正確に私が示した。目的は、アートワークオブジェクトにタグを追加することです。合理的な唯一の結合は、多対多です。私がLINQ-to-SQLでこれを行うには、ループを実行し、artwork_subjectオブジェクトを作成し、手動でバインドするしかありません。 奇妙なことに、私はアートワークとartwork_subjectsのテーブルを1対多数に結合することさえできません(tagSubjectsとartwork_subjectsにも同じことが適用されます)。 –

-1

はい。代わりに、多対多の使用の2多対1の関係:私はLINQ2SQLで働いM2Mを得ている

Subject -*----1- ArtworkSubjectParticipation -1----*- Artwork 
+2

OPがスクリーンショットですでに得たことはそれほどありませんか? –

+1

あなたは2対1対多を意味しますか? – Kobi

+0

それは私が持っているものの逆です。最終的な結果は、1つのタグだけが1つのアートワークに関連付けられることを意味しますが、これは目標ではありません。 @ Kobi、 –

5

方法:ビルダーに

  1. ドラッグの表を、あなたのような 」質問
  2. に示す再新しいRを作成 artworks_subjectartwor K
  3. との間の関係を削除します
  4. (ManyToOneが が存在しないため) その性質
  5. に OneToOneへOneToManyからの変更 カーディナリティを取得するための新たな関係の artworks_subjectにアートワーク
  6. クリックFROM elationshipは子供を開きますプロパティ セクションを開き、名前フィールドを に変更します(芸術作品を アートワークに)

tagSubjectエンティティはartwork_subjectsのコレクションを持っているだろう、とartwork_subjectアートワークと呼ばれるタイプアートワークの性質を持つことになります。今すぐLINQのような式を作ることができます

var x = dbcontext.tagSubjects.Single(s=>s.name=="Landscape"). 
    Artwork_Subjects. 
    Select(as=>as.Artwork.Name);