2013-10-23 55 views
0

模式,我有那些机型C#EF数据添加到

class Artist 
{ 
    public int Id { get; set; } 
    [StringLength(500)] 
    public string Name { get; set; } 
    [StringLength(50)] 
    public string LastName { get; set; } 

    public virtual ICollection<SimilarArtist> SimilarArtists { get; set; } 
} 

class SimilarArtist 
{ 
    public int Id { get; set; } 
    public int ArtistId { get; set; } 
    [ForeignKey("ArtistId")] 
    public Artist Artist { get; set; } 
    public int Similar_Artist_Id { get; set; } 
} 

所以每个艺术家都来自同一个表链接到其他5。当迁移生成数据库时,就会产生这种结构。

SELECT [Id] 
     ,[Name] 
     ,[LastName] 
    FROM [dbo].[Artists] 

SELECT [Id] 
     ,[ArtistId] 
     ,[Similar_Artist_Id] 
    FROM [dbo].[SimilarArtists] 

所以,当我做选择模型,可以返回此

var similar = _db.Artists.FirstOrDefault(x => x.Name == id).SimilarArtists.FirstOrDefault(); 

//similar.ArtistId 
//similar.Id 
//similar.Similar_Artist_Id 
//similar.Artist //the object which return main artist 

的问题是,我怎么能在“类似的变种”得到不只是Similar_Artist_Id而且名称,并在同一请求姓氏(不通过Similar_Artist_Id提出请求)

回答

1
var similarId = model.SimilarArtists.FirstOrDefault().Id; 
var artiest = _db.Artists.Where(x.Id = similarId); 

或者只是:

similar.Artist.Name 

或者如果您希望能够拥有强类型属性(例如similar.ArtistName),请创建一个[NotMapped] getter属性。

class SimilarArtist 
{ 
    public int Id { get; set; } 
    public int ArtistId { get; set; } 
    [ForeignKey("ArtistId")] 
    public Artist Artist { get; set; } 
    public int Similar_Artist_Id { get; set; } 
    [NotMapped] 
    public string ArtistName 
    { 
     get 
     { 
      return this.Artist.Name;    
     } 
    } 
} 
+0

1)它对数据库的请求更多。确定我可以做到这一点,但它不是一个点 2)similar.Artist.Name返回主艺术家的名字,并且它基于[ForeignKey(“ArtistId”)]每个艺术家对象5 – Duke

+0

相同,并且它返回信息I艾雷迪有 - >主要艺术家,但我需要基于Similar_Artist_Id的对象。这是一个问题。 – Duke

0

你可以做

var similar = _db.Artists.Where(x => x.Name == id) 
       .Select(a => a.SimilarArtists.FirstOrDefault()) 
       .FirstOrDefault(); 

这给你的第一SimilarArtists(与它的所有属性)第一Artists匹配谓语x.Name == id的。