2010-06-29 119 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

您需要在表格之间创建关系。如果你确定你已经创建了关系,那么可能是子类或父类属性的类可能被设置为互联网,他们应该公开