2010-06-29 2 views
5

Sto giocando con una galleria di immagini in ASP.NET MVC e sto cercando di capire come collegare LINQ a SQL allo stesso tempo. Ho 3 tabelle per contenere i dati della galleria di immagini, con una relazione molti-molti attraverso una tabella di collegamenti. Questi sono:LINQ a SQL Domanda di base - relazioni di tabella

Galleria
(Id, nome, descrizione)

Immagine
(Id, Titolo, Descrizione, nome del file)

GalleryImage
(GalleryId, ImageID)

GalleryImage ha relazioni FK impostate sulle altre due tabelle.

Desidero poter caricare le mie gallerie e visualizzare le immagini associate a ciascuna di esse, oltre alla possibilità di visualizzare una singola immagine ed elencare le gallerie a cui è associata. Dal momento che sono nuovo a Linq per SQL, non so come farlo. Qualcuno può guidarmi, per favore?

risposta

1

Passaggio 1: creare le associazioni tra le tabelle.Saprete questo è fatto correttamente quando

  • Galleria classe ha GalleryImages proprietà
  • classe GalleryImage ha Galleria proprietà e Immagine (nota, singolare)
  • classe Immagine ha GalleryImages proprietà.

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

Fase 2: Per avere una lista di gallerie:

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

Fase 3: poi l'utente clicca su una galleria e si desidera che le sue immagini:

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() 
} 

Passo 4: Quindi l'utente fa clic su un'immagine e si desidera che le sue gallerie:

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() 
} 

Se si desidera solo per caricare l'intero database, fare questo:

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(); 
} 

Dopo aver fatto questo, l'intero grafo oggetto verrà caricato e collegato per l'uso.

+0

Grazie. Devo fare qualcosa di molto semplice, ma non posso per la vita di me vedere cosa sia. Le mie tabelle DB hanno le relazioni definite, il mio diagramma dbml mostra quelle relazioni, eppure le mie entità non hanno le proprietà previste. – ZombieSheep

+0

Controllare i tipi delle proprietà coinvolte. Cercate di mettere in relazione stringhe a int, o int a s? Assicurati anche che ci siano chiavi primarie nel dbml. LinqToSql non può tracciare l'identità dell'oggetto (o creare proprietà relazionali e grafici oggetto) senza quelle chiavi primarie. –

+0

Era così. La mia tabella delle relazioni non aveva le chiavi impostate - per qualche ragione ho pensato che non ne avessero bisogno, solo FK. Grazie. :) – ZombieSheep

1
Gallery.GalleryImages<GalleryImage> 

Dovreste essere in grado di accedere ai vostri oggetti GalleryImage attraverso quella, e poi su ogni GalleryImage si può chiamare:

GalleryImage.Image 

Questo assume le relazioni sono rappresentate nella finestra di progettazione DBML?

+0

Grazie - Le relazioni sono presenti nel designer DBML, ma la proprietà GalleryImages non viene visualizzata in IntelliSense. Non sono sicuro di aver creato correttamente il DMBL - ho trascinato i tavoli sulla superficie del progetto, e tutto sembrava essere OK, ma quando carico le gallerie ('dalla Galleria in db.Galleries seleziona Galleria;'), I ottieni solo gli oggetti padre della galleria. È il modo sbagliato per ottenere i dati? – ZombieSheep

1

È necessario accedere a tutto questo tramite l'oggetto DataContext.

Dai un'occhiata al file C# generato per il tuo dbml e cerca le collezioni EntitySet contrassegnate con un attributo Association - ce ne dovrebbe essere una in Gallary e Image e 2 in GallaryImage. Se il dbml viene generato correttamente, si dovrebbe essere in grado di fare qualcosa di simile a quanto segue -

Fuori della parte superiore della mia testa, io sono abbastanza sicuro che l'area di progettazione nominerà il plurale di galleria come Gallerys invece di gallerie, quindi non è un errore di battitura -

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()); 
     } 
    } 

Anche senza le associazioni, il seguente dovrebbe funzionare -

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; 

Per ottenere gallaries da un id pic, faresti -

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; 

Quanto sopra restituirà un IQueryable<Gallary> e eseguirà la query sql quando si enumera su di esso.

+0

Sembra che il mio codice generato abbia le associazioni di cui parli, ma non ho accesso ad esse nel mio codice. Sembra che l'entità galleria generata non contenga solo una raccolta di oggetti GalleryImage. Ho anche provato a ricreare le entità per vedere se ho fatto qualcosa di stupido al primo tentativo, ma nessuna gioia. Ho svitato per gli ultimi 2 esempi, anche se speravo di non dover scendere lungo il percorso esplicito per ottenerli. – ZombieSheep

-1

È necessario creare relazioni tra le tabelle. se sei sicuro di aver creato le relazioni allora potrebbero essere le proprietà figlio o genitore delle classi potrebbero essere impostate su internet dovrebbero essere pubbliche