实体框架导航属性一对多成为一对一

时间:2012-07-05 17:16:29

标签: c# .net sql-server linq entity-framework

在我的数据库中,我有一对多关系(乐队有很多专辑)。但是,当相册中的外键受到限制时,这种关系就变为一对一。

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

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

我的问题是我应该在Band中拥有另一个导航属性public virtual Album Album,还是因为这并不总是正确的,这是个坏主意?我应该使用LINQ吗?使用Entity Framework和模型实现此目的的最简单方法是什么?

2 个答案:

答案 0 :(得分: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; }
}

答案 1 :(得分:0)

如果你添加

public virtual Album Album;

会与

发生冲突
public virtual ICollection<Album> Albums { get; set; }

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

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

根据您的需要,您可能需要添加

public virtual Band Band { get; set;}

Album

我不明白你的意思

  

但是,当相册中的外键受到限制时,这种关系会变为一对一。

你可以澄清这句话吗?