2012-04-15 41 views
0

我有3個表格。一個叫藝術家,一個叫宋,一個叫專輯。Entity FrameWork使用Asp.Net的多對多關係

藝術家與歌曲關聯爲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; 
    } 
} 
+3

可能要從您的標題中刪除Asp.Net,因爲這純粹是實體框架相關。 – Ocelot20 2012-04-15 22:30:25

+1

......併發布你的模型 - 你先用什麼代碼? – NSGaga 2012-04-16 00:42:05

+0

我想發佈我的模型,但我沒有足夠的聲望點發布圖片,所以我試圖解釋它。 – Joe24 2012-04-16 01:58:09

回答

0

我想這是因爲你有一個1到歌曲和專輯之間一對多的關係,所以你必須定義該專輯與歌曲相關聯的(如你所說的藝術家)

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

我想這可能工作

2

首先,如果你有很多一對多SongAlbumSong實體應包含的Albums收集和Album實體之間的關係應包含集合Songs

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

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

不要忘了映射它們。例如,如果你使用流利的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; 
    } 
} 
0

很好的答案algreat,讓我的亮點2點,因爲我已經被EF錯誤多對多關聯(相應的導航屬性發送和異常而不檢索信息),這很重要:

  • OnCreatingModel中的映射如果未映射到相應的中間表,則EF無法找到此object來執行連接,而是在edmx文件中省略的表。

  • 如果您正在使用的工具生成的實體和數據的上下文,至極是我的情況下,並修改edmx文件,你可能將不得不重新編寫這一點,因爲這一切的「生成的對象」將刷新到初始狀態和您的映射,您的數據註釋和那些東西將被刪除。

希望這有助於!

相關問題