2010-06-29 185 views
5

我正在玩ASP.NET MVC中的圖像庫,並試圖讓我的頭在同一時間LINQ to SQL。我有3張桌子可以放置圖片庫數據,並通過鏈接表提供多種關係。它們是:LINQ to SQL基本問題 - 表關係

畫廊
(ID,姓名,說明)

圖片
(ID,標題,描述,文件名)

GalleryImage
(GalleryId,圖像標識)

GalleryImage將FK關係設置爲另外兩個表格。

我希望能夠加載我的畫廊,並顯示與每個畫廊相關的圖像,以及能夠顯示單個圖像並列出與其相關聯的畫廊。由於我是Linq to SQL的新手,我不知道該怎麼做。任何人都可以指導我嗎?

回答

1

第1步:創建表之間的關聯。你會知道什麼時候

  • 類畫廊擁有財產GalleryImages
  • 類GalleryImage擁有財產畫廊和圖片(注,單數)
  • 類圖像具有財產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 2010-06-29 14:42:53

+0

檢查涉及的屬性的類型。注意將字符串與int相關聯,或將int與int相關聯。還要確保在dbml中有主鍵。 LinqToSql無法跟蹤沒有這些主鍵的對象標識(或製作關係屬性和對象圖)。 – 2010-06-29 14:44:10

+0

就是這樣。我的關係表沒有設置鍵 - 出於某種原因,我認爲它不需要它們,只有FK。謝謝。 :) – ZombieSheep 2010-06-29 14:53:49

1
Gallery.GalleryImages<GalleryImage> 

您應該能夠通過訪問您的GalleryImage對象,然後在每個GalleryImage您可以撥打:

GalleryImage.Image 

這是假設的關係在DBML設計師的代表?

+0

謝謝 - 關係存在於DBML設計器中,但GalleryImages屬性在IntelliSense中沒有出現。我不確定我是否已經正確創建了DMBL - 我將表格拖放到設計圖面上,並且全部看起來都沒問題,但是當我加載圖庫時(從db.Galleries中的Gallery中選擇Gallery;'),我只獲得畫廊父項。這是獲取數據的錯誤方法嗎? – ZombieSheep 2010-06-29 08:40:57

1

您需要通過DataContext對象訪問所有這些。

查看您的dbml生成的c#文件,並查找標記有Association屬性的EntitySet集合 - Gallary和Image中應該有一個集合,在GallaryImage中應該有一個。如果dbml生成正確,你應該可以做下面的事情 -

我非常確定設計表面將命名爲Gallerys而不是圖庫的圖庫複數,所以它不是一個錯字 -

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; 

若要從PIC ID獲得gallaries,你會怎麼做 -

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對象的集合。我甚至嘗試重新創建實體,看看我是否第一次做了什麼愚蠢的事情,但沒有喜悅。 我已經提出了最後的兩個例子,儘管我希望不必爲了得到它們而明確的路線。 – ZombieSheep 2010-06-29 14:14:18

-1

您需要在表格之間創建關係。如果你確定你已經創建了關係,那麼可能是子類或父類屬性的類可能被設置爲互聯網,他們應該公開