2010-06-29 2 views
5

Я играю с галереей изображений в ASP.NET MVC и пытаюсь разглядеть LINQ to SQL одновременно. У меня есть 3 таблицы для хранения данных в галерее изображений со многими отношениями через таблицу ссылок. К ним относятся:LINQ to SQL Базовые отношения вопрос - таблица

Галерея
(Id, Name, Description)

Image
(Id, название, описание, FileName)

GalleryImage
(GalleryId, ImageID)

GalleryImage имеет отношения FK, установленные для двух других таблиц.

Я хочу, чтобы иметь возможность загружать мои галереи и отображать изображения, связанные с каждым, а также иметь возможность отображать одно изображение и список галерей, с которыми он связан. Поскольку я новичок в Linq для SQL, я не знаю, как это сделать. Может ли кто-нибудь вести меня, пожалуйста?

ответ

1

Шаг 1: создайте ассоциации между таблицами.Вы знаете, что это сделано правильно, когда

  • класса Галерея имеет GalleryImages недвижимости
  • класс GalleryImage имеет свойство галерею и изображение (примечание, в единственном числе)
  • класса Image имеет GalleryImages собственности.

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

Шаг 2: Для того, чтобы получить список галерей:

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

Шаг 3: Затем пользователь нажимает на галерею, и вы хотите его изображения:

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

Шаг 4: Затем пользователь нажимает на изображение, и вы хотите его галереи:

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

Если вы просто хотите загрузить всю базу данных, сделайте следующее:

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

После выполнения этого весь объект граф будет загружен и подключен к использованию.

+0

Спасибо. Я, должно быть, делаю что-то очень неправильное, но не могу, чтобы жизнь меня видя, что это такое. В моих таблицах БД определены отношения, моя диаграмма dbml показывает эти отношения, и все же мои сущности не должны ожидать ожидаемых свойств. – ZombieSheep

+0

Проверьте типы объектов. Следите за привязкой строк к ints или ints int. Также убедитесь, что в dbml есть первичные ключи. LinqToSql не может отслеживать идентификацию объекта (или создавать реляционные свойства и графы объектов) без этих первичных ключей. –

+0

Вот и все. В моей таблице отношений не было настроено ключей - по какой-то причине я предполагал, что они им не нужны, только FK. Благодарю. :) – ZombieSheep

1
Gallery.GalleryImages<GalleryImage> 

Вы должны быть в состоянии получить доступ к объектам GalleryImage через это, а затем на каждом GalleryImage вы можете позвонить:

GalleryImage.Image 

Это предполагает, что отношения представлены в дизайнере DBML?

+0

Спасибо - отношения присутствуют в дизайнере DBML, но свойство GalleryImages не появляется в IntelliSense. Я не уверен, что правильно создал DMBL - я перетащил таблицы на поверхность дизайна, и все выглядело нормально, но когда я загружаю галереи ('from Gallery in db.Galleries select Gallery;'), я только получить родительские элементы галереи. Это неправильный способ получить данные? – ZombieSheep

1

Вам необходимо получить доступ ко всему этому через объект DataContext.

Загляните в сгенерированный файл C# для своего dbml и найдите коллекции EntitySet, отмеченные атрибутом Association - в Gallary и Image должен быть один, а в GallaryImage - 2. Если dbml генерируется правильно, вы должны сделать что-то вроде следующего:

Сверху моей головы я уверен, что поверхность дизайна назовет множественное число Галерея как Галерея вместо Галереи, так что это не опечатка -

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

Даже без ассоциаций, должно работать -

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; 

Чтобы получить из, галереи ПИК идентификатору, вам нужно сделать -

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; 

Вышеупомянутое вернет вам IQueryable<Gallary> и выполнит запрос sql, когда вы перечислите его.

+0

Кажется, что у моего сгенерированного кода есть ассоциации, о которых вы говорите, но у меня нет доступа к ним в моем коде. Кажется, что созданный объект Gallery просто не содержит коллекцию объектов GalleryImage. Я даже попытался воссоздать сущности, чтобы увидеть, что я сделал что-то глупое в первый раз, но без радости. Я поддержал последние 2 примера, хотя я надеялся, что не должен идти по явному пути, чтобы получить их. – ZombieSheep

-1

Необходимо создать отношения между таблицами. если вы уверены, что создали отношения, то могут быть дочерние или родительские свойства классов, которые могут быть установлены в Интернете, они должны быть общедоступными.

Смежные вопросы