2010-06-29 4 views
5

Ich spiele mit einer Bildergalerie in ASP.NET MVC und versuche gleichzeitig LINQ to SQL zu verstehen. Ich habe 3 Tabellen, um Bildergalerie-Daten zu halten, mit einer Viele-Viele-Beziehung durch eine Linktabelle. Diese sind:LINQ to SQL Grundlegende Frage - Tabellenbeziehungen

Galerie
(ID, Name, Beschreibung)

Bild
(Id, Titel, Beschreibung, Filename)

GalleryImage
(GalleryId, ImageId)

GalleryImage hat FK-Beziehungen zu den anderen beiden Tabellen eingerichtet.

Ich möchte in der Lage sein, meine Galerien zu laden, und die Bilder, die mit jedem verbunden sind, sowie die Möglichkeit, ein einzelnes Bild anzuzeigen und die Galerien anzuzeigen, mit denen es verknüpft ist. Da ich neu bei Linq zu SQL bin, weiß ich nicht, wie das geht. Kann mir bitte jemand helfen?

Antwort

1

Schritt 1: Erstellen Sie die Verknüpfungen zwischen den Tabellen.Sie wissen, dass dies richtig gemacht wird, wenn

  • Klasse Gallery Eigenschaft GalleryImages hat
  • Klasse GalleryImage hat Eigenschaft Galerie und Bild (Note, Singular)
  • Klasse Bild hat Eigenschaft GalleryImages.

http://msdn.microsoft.com/en-us/library/bb629295.aspx

Schritt 2: eine Liste der Galerien erhalten:

using (CustomDataContext myDC = new CustomDataContext) 
{ 
    List<Gallery> result = myDC.Galleries.ToList(); 
} 

Schritt 3: dann klickt der Benutzer auf einer Galerie und Sie möchten ihre Bilder:

using (CustomDataContext myDC = new CustomDataContext) 
{ 
    List<Image> result = myDC.Galleries 
    .Where(g => g.Id = selectedGallery.Id); 
    .SelectMany(g => g.GalleryImages) 
    .Select(gi => gi.Image) 
    .ToList() 
} 

Schritt 4: Dann klickt der Benutzer auf ein Bild und Sie wollen seine Galerien:

using (CustomDataContext myDC = new CustomDataContext) 
{ 
    List<Gallery> result = myDC.Images 
    .Where(i => i.Id = selectedImage.Id); 
    .SelectMany(i => i.GalleryImages) 
    .Select(gi => gi.Galleries) 
    .ToList() 
} 

Wenn Sie nur die gesamte Datenbank laden möchten, dies tun:

using (CustomDataContext myDC = new CustomDataContext) 
{ 
    DataLoadOptions dlo = new DataLoadOptions(); 
    dlo.LoadWith<Gallery>(g => g.GalleryImages); 
    dlo.LoadWith<GalleryImage>(gi => gi.Image); 
    myDC.LoadOptions = dlo; 

    List<Gallery> result = myDC.Galleries.ToList(); 
} 

Nachdem das tun, wird das gesamte Objekt Diagramm geladen und für die Nutzung angeschlossen werden.

+0

Danke. Ich muss etwas sehr grundlegendes falsches tun, aber kann nicht für das Leben von mir sehen, was es ist. Meine DB-Tabellen haben die Beziehungen definiert, mein DBML-Diagramm zeigt diese Beziehungen und trotzdem müssen meine Entitäten keine erwarteten Eigenschaften haben. – ZombieSheep

+0

Überprüfen Sie die Arten der beteiligten Eigenschaften. Achten Sie darauf, Strings mit Ints oder Ints mit Ints zu verknüpfen. Stellen Sie außerdem sicher, dass in der dbml Primärschlüssel vorhanden sind. LinqToSql kann Objektidentität (oder relationale Eigenschaften und Objektdiagramme) ohne diese Primärschlüssel nicht verfolgen. –

+0

Das war es. Meine Beziehungstabelle hatte keine Schlüssel eingerichtet - aus irgendeinem Grund nahm ich an, dass sie sie nicht brauchten, nur FKs. Vielen Dank. :) – ZombieSheep

1
Gallery.GalleryImages<GalleryImage> 

Sie sollten Ihre GalleryImage Objekte durch das, und dann auf jedem GalleryImage zugreifen können, können Sie anrufen:

GalleryImage.Image 

Dies setzt voraus, die Beziehungen im DBML Designer vertreten sind?

+0

Vielen Dank - Die Beziehungen sind im DBML-Designer vorhanden, aber die GalleryImages-Eigenschaft wird in IntelliSense nicht angezeigt. Ich bin mir nicht sicher, ob ich das DMBL korrekt erstellt habe - ich habe die Tabellen auf die Designoberfläche gezogen, und alles schien OK zu sein, aber wenn ich die Galerien lade ('from Gallery in db.Galleries Gallery;'), I Erhalte nur die Galerie-Elternartikel. Ist das der falsche Weg, um die Daten zu bekommen? – ZombieSheep

1

Sie müssen auf all dies über Ihr DataContext-Objekt zugreifen.

Werfen Sie einen Blick in die generierte C# -Datei für Ihre dbml und suchen Sie nach EntitySet-Sammlungen, die mit einem Assoziationsattribut gekennzeichnet sind - in Gallary und Image und in GallaryImage. Wenn die dbml korrekt generiert wird, sollten Sie in der Lage sein, Folgendes zu tun:

Ich bin mir ziemlich sicher, dass die Designoberfläche den Plural von Gallery als Gallerys anstelle von Galerien benennen wird. so ist es kein Tippfehler -

DataConext dc = new GalleryDataConext(); 
foreach (Gallery g in dc.Gallerys) 
{ 
    Console.Writeline("gallery id " + g.Id.ToString()); 
    foreach(GalleryImage gi in g.GalleryImages) 
    { 
     Console.Writeline("galleryimage id " + gi.Id.ToString()); 
     foreach(Image i in gi) 
     { 
     Console.Writeline("image id " + i.Id.ToString()); 
     } 
    } 

Auch ohne die Verbände, sollte die folgende Arbeit -

int GalID = 1; 
GalleryDataConext dc = new GalleryDataConext() 
var pics = from g in dc.Gallary 
      join gi in dc.GallaryImages on g.Id equals gi.GallaryId 
      join i in dc.Images on gi.ImageId equals i.Id 
      where g.Id = GalID 
      select i; 

Um Gallaries von einem Bild-ID zu erhalten, würden Sie tun -

int PicID = 1; 
var gals = from g in dc.Gallary 
      join gi in dc.GallaryImages on g.Id equals gi.GallaryId 
      join i in dc.Images on gi.ImageId equals i.Id 
      where i.Id = PicID 
      select g; 

Das obige gibt Ihnen eine IQueryable<Gallary> zurück und wird die SQL-Abfrage durchführen, wenn Sie darüber aufzählen.

+0

Es scheint, dass mein generierter Code die Assoziationen hat, über die Sie sprechen, aber ich habe innerhalb meines Codes keinen Zugriff darauf. Es scheint, dass das generierte Gallery-Objekt keine Sammlung von GalleryImage-Objekten enthält. Ich habe sogar versucht, die Entitäten neu zu erstellen, um zu sehen, ob ich beim ersten Mal etwas Dummes getan habe, aber keine Freude. Ich habe für die letzten 2 Beispiele uplooted, obwohl ich gehofft hatte, nicht auf den expliziten Weg gehen zu müssen, um sie zu bekommen. – ZombieSheep

-1

Sie müssen Beziehungen zwischen den Tabellen erstellen. Wenn Sie sicher sind, dass Sie die Beziehungen erstellt haben, dann können Kind- oder Elterneigenschaften von Klassen auf Internet gesetzt werden. Sie sollten öffentlich sein.