0

我有 3 张桌子。一个叫Artist,一个叫Song,一个叫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;
    }
}
4

3 回答 3

2

首先,如果您之间存在多对多关系,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;
    }
}
于 2012-04-19T09:10:20.727 回答
0

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

  • 中的Mapping OnCreatingModel,如果不映射到对应的中间表,EF找不到这个object来执行join,就是edmx文件中省略的表。

  • 如果您使用工具来生成实体和数据上下文,这就是我的情况,并修改edmx文件,您可能必须再次编码,因为所有这些“生成的对象”将刷新到初始状态和您的映射,您的数据注释和那些东西将被删除。

希望这可以帮助!

于 2013-02-28T12:51:27.930 回答
0

我认为发生这种情况是因为歌曲和专辑之间存在一对多的关系,因此您必须定义与歌曲相关联的专辑(如您放置艺术家)

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

我认为这可能有效

于 2012-04-16T10:03:27.407 回答