2012-07-05 182 views
1

在我的数据库中,我有一对多的关系(乐队有很多专辑)。然而,当相册中的外键被限制时,这种关系变成一对一关系。应生成实体框架导航属性一对多变成一对一

SELECT * FROM Band 
LEFT JOIN Album ON (Band.BandID = Album.AlbumID AND Album.SomeOtherKey = 12) 

我的问题

public class Band 
{ 
    [Key] 
    public int BandID { get; set; } 

    //Other fun attributes 

    public virtual ICollection<Album> Albums { get; set; } 
} 

public class Album 
{ 
    [Key] 
    public int AlbumID { get; set; } 

    public int BandID { get; set; } 

    //Other fun attributes 

    //Some other foreign key 
    public int SomeOtherKey { get; set; } 
} 

SQL是我应该有另外一个导航属性public virtual Album Album的乐队,或者因为这并非总是如此,这将是一个坏主意?我应该使用LINQ吗?使用实体框架和模型来实现这个最简单的方法是什么?

回答

1

答案是不使用的导航性能,但用户LINQ查询用一种新的模式来保存结果是这样的...

var query = 
    from band in Context.Band 
    join album in Context.Albums on album.BandID equals band.BandID into j1 
    from j2 in j1.Where(x => x.SomeOtherKey == value).DefaultIfEmpty() 
    select new BandWithAlbumModel 
    { 
     Band = band, 
     Album = j2 
    }; 


public class BandWithAlbumModel 
{ 
    public Band Band { get; set; } 

    public Album Album { get; set; } 
} 
0

如果添加

public virtual Album Album; 

,将与

public virtual ICollection<Album> Albums { get; set; } 

的第一次冲突意味着一个1:1的关系,而后者意味着一个1:N的关系。

由于大概可以有一个乐队可以有多个(或没有)专辑(这里的领域知识:-),ICollection是你最想要的。

根据您的需求,您可能希望

public virtual Band Band { get; set;} 

添加到Album

我不明白你的意思由

但是当专辑外键被限制这种关系成为一个对一个。

你能否澄清那句话?

+0

是。基本上,一旦Album表中的SomeOtherKey字段受到限制(通过WHERE Album.SomeOtherKey =?),Album和Band之间的关系就会变为一对一。我在相册中有Band导航属性,但我希望我的查询生成一个列表,并且需要先检查Albums表。 – 2012-07-05 18:42:44