2010-06-29 37 views
5

Estoy jugando con una galería de imágenes en ASP.NET MVC y tratando de entender LINQ to SQL al mismo tiempo. Tengo 3 tablas para guardar los datos de la galería de imágenes, con una relación de muchos a través de una tabla de enlaces. Estos son:LINQ to SQL Pregunta básica - relaciones de tabla

Galería
(Id, nombre, descripción)

imagen
(Id, título, descripción, nombre del archivo)

GalleryImage
(GalleryId, ImageID)

GalleryImage tiene relaciones FK configuradas para las otras dos tablas.

Quiero cargar mis galerías y mostrar las imágenes asociadas a cada una de ellas, así como también poder mostrar una sola imagen y enumerar las galerías a las que está asociada. Como soy nuevo en Linq para SQL, no sé cómo hacer esto. ¿Alguien puede guiarme, por favor?

Respuesta

1

Paso 1: cree las asociaciones entre las tablas.Usted sabrá que esto se hace correctamente cuando

  • Galería clase tiene GalleryImages propiedad
  • GalleryImage clase tiene Galería de propiedad y de imagen (nota, singular)
  • clase Imagen tiene GalleryImages propiedad.

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

Paso 2: Para obtener una lista de galerías:

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

Paso 3: A continuación, el usuario hace clic en una galería y desea que sus imágenes:

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

Paso 4: A continuación, el usuario hace clic en una imagen y desea sus galerías:

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

Si lo que desea es cargar toda la base de datos, haga lo siguiente:

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

Después de hacer eso, todo el gráfico de objetos será cargado y conectado para su uso.

+0

Gracias. Debo estar haciendo algo muy básico, pero no puedo ver qué es. Mis tablas DB tienen las relaciones definidas, mi diagrama dbml muestra esas relaciones y, sin embargo, mis entidades no tienen las propiedades esperadas. – ZombieSheep

+0

Verifique los tipos de propiedades involucradas. Esté atento a la relación de las cadenas a las entradas, o las entradas a las int. También asegúrese de que haya claves principales en el dbml. LinqToSql no puede rastrear la identidad del objeto (o hacer propiedades relacionales y gráficos de objetos) sin esas claves primarias. –

+0

Eso fue todo. Mi tabla de relaciones no tenía las teclas configuradas, por alguna razón asumí que no las necesitaba, solo FK. Gracias. :) – ZombieSheep

1
Gallery.GalleryImages<GalleryImage> 

Usted debe ser capaz de acceder a sus objetos GalleryImage través de eso, y luego en cada GalleryImage puede llamar:

GalleryImage.Image 

Esto asume las relaciones se representan en el diseñador DBML?

+0

Gracias: las relaciones están presentes en el diseñador DBML, pero la propiedad GalleryImages no aparece en IntelliSense. No estoy seguro de haber creado correctamente el DMBL: arrastré las tablas hasta la superficie de diseño, y todo parecía estar bien, pero cuando cargo las galerías ('desde Galería en db.Galerías seleccione Galería;'), solo obtén los elementos principales de la galería. ¿Es esa la forma incorrecta de obtener los datos? – ZombieSheep

1

Necesita acceder a todo esto a través de su objeto DataContext.

Eche un vistazo al archivo C# generado para su dbml y busque las colecciones de EntitySet marcadas con un atributo de asociación; debe haber una en Gallary e Image, y 2 en GallaryImage. Si el dbml se genera correctamente, debería poder hacer algo como lo siguiente:

En la parte superior de mi cabeza, estoy bastante seguro de que la superficie de diseño nombrará el plural de Galería como Galería en lugar de Galerías, así que no es un error tipográfico -

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

Incluso sin las asociaciones, el siguiente debería funcionar -

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; 

Para obtener gallaries de una Identificación del pic, que haría -

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; 

Lo anterior le devolverá un IQueryable<Gallary> y hará la consulta SQL cuando enumere sobre ella.

+0

Parece que mi código generado tiene las Asociaciones de las que habla, pero no tengo acceso a ellas dentro de mi código. Parece que la entidad Gallery generada simplemente no contiene una colección de objetos ImageImage. Incluso intenté volver a crear las entidades para ver si hice algo estúpido la primera vez, pero no alegría. He votado en favor de los 2 ejemplos finales, aunque esperaba no tener que ir por la ruta explícita para obtenerlos. – ZombieSheep

-1

Necesita crear relaciones entre las tablas. si está seguro de haber creado las relaciones, entonces puede ser que las propiedades secundarias o secundarias de las clases se establezcan en Internet, deben ser públicas