在我的数据库中,我有一对多关系(乐队有很多专辑)。但是,当相册中的外键受到限制时,这种关系就变为一对一。
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和模型实现此目的的最简单方法是什么?
答案 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
。
我不明白你的意思
你可以澄清这句话吗?但是,当相册中的外键受到限制时,这种关系会变为一对一。