2009-09-02 4 views
6

LINQ jusqu'à présent a été remarquablement élégant, mais pour effectuer des requêtes de base m2m il offre aucune solution que je peux voir immédiatement.Relations LINQ many-to-many: Solution?

Ce qui est pire est que, bien que cela fonctionne pour toute autre relation de table, LINQ ne me donne pas d'association dans la structure de classe pour ma table m2m.

Je peux faire des choses comme

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

mais je ne peux pas faire

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

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

Y at-il un modèle commun pour résoudre cette limitation?

+0

Pour une raison que j'ignore, m2m me semble sale ... pensez à l'épeler; – TJB

Répondre

3

J'ai trouvé la solution moi-même. Pour que les relations automatisées fonctionnent, les deux tables ont besoin de clés primaires (oups). Notez qu'il manque le symbole PK dans artworks_subjects.

2

Cela dépend en grande partie du framework que vous utilisez. Il sons comme vous utilisez LINQ-to-SQL, qui est très littérale sur les tables aux objets. Avec Entity Framework, il existe un support intégré pour many-to-many, en particulier pour le cas trivial que vous avez listé (une table de liaison sans propriétés supplémentaires). EF repèrera généralement ce modèle et masquera la table de liens du modèle conceptuel (je ne m'en souviens pas, mais il pourrait avoir besoin d'un PK couvrant les deux colonnes FK).

Bien sûr, cela devient aigri si vous voulez ajouter des colonnes à la table de liens; Donc, à certains égards, je serais tenté de le laisser tel quel.

En ce qui concerne le where etc - comment voulez-vous dire? Vous pouvez faire des jointures sur l'association, et vous devriez pouvoir utiliser Any etc. avez-vous un exemple concret de ce que vous voulez faire?

+0

à peu près exactement ce que j'ai montré. L'objectif est d'ajouter une balise à l'objet d'illustration. La seule jointure raisonnable est Many to Many. La seule façon que j'ai vu si pété de le faire avec LINQ-to-SQL est d'exécuter une boucle, en créant des objets artwork_subject, et de les lier manuellement. Ce que je trouve si étrange, c'est que je ne peux même pas faire un un-à-un-un-joint entre les tables artwork et artwork_subjects (de même que tagSubjects et artwork_subjects). –

-1

Oui.Au lieu de beaucoup à beaucoup utilisent deux many-to-one relations:

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

N'est-ce pas à peu près ce que l'OP a déjà dans la capture d'écran? –

+1

vous voulez dire deux one-to-many, non? – Kobi

+0

c'est l'inverse de ce que j'ai. mais le résultat net signifierait qu'une seule étiquette pourrait être associée à une œuvre, ce qui n'est pas le but. –

5

la façon dont je l'ai obtenu travailler M2M LINQ2SQL:

  1. glisser les tables dans le générateur, comme vous re montrant la question
  2. supprimer la relation entre artworks_subject et artwor k
  3. créer un nouveau r ELATIONS DE artworks_subject À oeuvre
  4. cliquez sur la nouvelle relation pour obtenir ses propriétés
  5. changer la cardinalité de OneToMany à OneToOne (parce que ManyToOne ne existe)
  6. ouvrir l'enfant Propriété section et modifiez le champ Nom à rendez le singulier (Oeuvres à oeuvre)

maintenant la entité tagSubject aura une collection de artwork_subjects et le artwork_subject aura une propriété d'œuvres d'art de type appelé Création. donc vous pouvez maintenant faire une expression LINQ comme

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