C# 使用Asp.Net的实体框架多对多关系

C# 使用Asp.Net的实体框架多对多关系,c#,entity-framework,C#,Entity Framework,我有三张桌子。一个叫艺术家,一个叫歌曲,一个叫专辑 艺术家与歌曲的链接为1对多。艺术家也以1对多的形式链接到专辑。这首歌被链接到相册,所以自动创建了一个桥接表。歌曲表的导航属性为艺人和唱片集,唱片集的导航属性为艺人和歌曲。我想添加一首新歌。添加歌曲时,桥接表不会更新,因此我想知道如何在添加歌曲时引用与之关联的唱片集 public int CreateNewSong(String name,String songTitle) { using(var context = new Myenti

我有三张桌子。一个叫艺术家,一个叫歌曲,一个叫专辑

艺术家与歌曲的链接为1对多。艺术家也以1对多的形式链接到专辑。这首歌被链接到相册,所以自动创建了一个桥接表。歌曲表的导航属性为艺人和唱片集,唱片集的导航属性为艺人和歌曲。我想添加一首新歌。添加歌曲时,桥接表不会更新,因此我想知道如何在添加歌曲时引用与之关联的唱片集

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;
    }
}

我认为这是因为歌曲和专辑之间有一对多的关系,所以你必须定义哪个专辑与歌曲相关(正如你所说的艺术家)


我认为这可能首先起作用,如果你在
歌曲
专辑
之间有多对多关系,你的
歌曲
实体应该包含
专辑
的集合,而
专辑
实体应该包含
歌曲的集合:

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

public class Album
{
    ...
    public virtual ICollection<Song> Songs { get; set; }
}

非常好的回答
algreat
,让我突出强调两点,因为我遇到了EF多对多关系错误(相应的导航属性是发送和异常,而不是检索信息),这很重要:

  • OnCreatingModel
    中的映射是
    edmx
    文件中省略的表,如果未映射到相应的中间表,EF无法找到此
    对象来执行联接

  • 如果您正在使用工具生成实体和数据上下文(我就是这样),并修改
    edmx
    文件,您可能需要再次对其进行编码,因为所有这些“生成的对象”将刷新到初始状态,并且映射、数据注释和这些内容将被删除


希望这有帮助

可能想从你的标题中删除Asp.Net,因为这纯粹是实体框架相关的…并发布你的模型-你首先使用的代码是什么?我想发布我的模型,但我没有足够的信誉点来发布图像,所以我尝试解释它。将你的图像发布到其他地方并添加链接
public class Song
{
    ...
    public virtual ICollection<Album> Albums { get; set; }
}

public class Album
{
    ...
    public virtual ICollection<Song> Songs { get; set; }
}
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;
    }
}