繁体   English   中英

实体FrameWork使用Asp.Net的多对多关系

[英]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;
    }
}

首先,如果SongAlbum之间存在多对多关系,则您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM