[英]Entity FrameWork Many to Many relationship using Asp.Net
我有3张桌子。 一个叫做艺术家,一个叫宋,一个叫专辑。
艺术家与歌曲的关联为1对多。 艺术家也与Album链接为1对多。 歌曲与Album链接了许多对,因此自动创建了一个桥接表。 歌曲表具有艺术家和专辑的导航属性,该专辑具有艺术家和歌曲的导航属性。 我想添加一首新歌。 添加歌曲时,桥接表不会更新,所以我想知道在添加歌曲时如何引用与歌曲相关联的专辑。
public int CreateNewSong(String name,String songTitle)
{
using(var context = new Myentities())
{
Song theNewSong = new Song()
Artist refer = context.Artists.Single(o => o.ArtistName == name);
theNewSong.SongTitle = songTitle;
theNewSong.Artist_ArtistID = refer.ArtistID;
context.Songs.AddObject(theNewSong);
context.SaveChanges();
return theNewSong.SongID;
}
}
首先,如果Song
和Album
之间存在多对多关系,则您的Song
实体应包含Albums
集合,而Album
实体应包含Songs
集合:
public class Song
{
...
public virtual ICollection<Album> Albums { get; set; }
}
public class Album
{
...
public virtual ICollection<Song> Songs { get; set; }
}
别忘了映射它们。 例如,如果您使用Fluent API将其添加到您的上下文类:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Song>()
.HasMany(s => s.Albums)
.WithMany(a => a.Songs)
.Map(m =>
{
m.MapLeftKey("SongID");
m.MapRightKey("AlbumID");
m.ToTable("SongAlbums");
});
}
所以你的方法将类似于这个:
public int CreateNewSong(String name, String songTitle, String album)
{
using(var context = new Myentities())
{
Album album = context.Albums.Single(o => o.AlbumName == album);
Artist refer = context.Artists.Single(o => o.ArtistName == name);
Song theNewSong = new Song {
SongTitle = songTitle,
Artist = refer
};
theNewSong.Albums.Add(album);
context.Songs.AddObject(theNewSong);
context.SaveChanges();
return theNewSong.SongID;
}
}
我认为这是因为你在歌曲和专辑之间有一对多的关系,所以你必须定义哪一张专辑与歌曲相关(当你放置艺术家时)
public int CreateNewSong(String name,String songTitle,String album)
{
using(var context = new Myentities())
{
Song theNewSong = new Song()
Artist refer = context.Artists.Single(o => o.ArtistName == name);
Album album = context.Albums.Single(o => o.AlbumName == album);
theNewSong.SongTitle = songTitle;
theNewSong.Artist_ArtistID = refer.ArtistID;
theNewSong.Album_AlbumID = album.AlbumID;
context.Songs.AddObject(theNewSong);
context.SaveChanges();
return theNewSong.SongID;
}
}
我认为这可行
非常好的答案algreat
,让我突出2点,因为我一直被错误的EF多对多关系(相应的导航属性发送和异常,而不是检索信息),这很重要:
OnCreatingModel
中的OnCreatingModel
,如果未映射到相应的中间表,则EF无法找到此object
来执行连接,是edmx
文件中省略的表。
如果您正在使用工具来生成实体和数据上下文,那么就是我的情况,并修改edmx
文件,您可能需要再次对此进行编码,因为所有这些“生成的对象”将刷新到初始状态和映射,您的数据注释和那些东西将被删除。
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.