4

设置关联说我有一个多对多的关系:EF - 加入凭身份证

Song *---* Artist 

我在我的代码一个地步,我想一个艺术家加入到歌曲。我知道艺术家的ID,但我没有Artist实体的实例。

目前我有做一些事情,如:

var artist = context.Artists.Single(a => a.Id == artistId); 
song.Artists.Add(artist); 

这涉及到一个DB查询。

的许多一对多的关系建模为一个表:

SongId | ArtistId 
-------+--------- 

我今天准备这样做,因为性能原因,是刚刚添加到这个表中的条目,而不必去DB加载一堆我不需要的实体数据。

有没有办法与EF做到这一点?例如,像这样的API:

song.Artists.Add(artistId); 

回答

5

您可以使用虚拟对象:

var song = context.Songs.Single(s => s.Id == songId); 
var artist = new Artist { Id = artistId }; 
context.Artists.Attach(artist); 
song.Artists.Add(artist); 
context.SaveChanges(); 
+0

非常有趣。我会尽快尝试。所以这不会为虚拟实体提取任何额外的数据?非常感谢! – 2011-03-30 20:48:01

+0

不,虚拟实体只是实体键(主键)数据的占位符。 – 2011-03-30 21:24:12

+0

一个非常好的解决方案,再次感谢。这是指定实体键的一种智能方式,我认为它可以是任何类型(或者甚至可以是复合键,尽管我还没有尝试过)。 – 2011-03-30 23:31:18