2012-04-15 13 views
0

私は3つのテーブルを持っています。 1つはアーティスト、1つはソング、もう1つはアルバムと呼ばれました。エンティティフレームワーク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

純粋にEntity Framework関連であるため、タイトルからAsp.Netを削除したい場合があります。 – Ocelot20

+1

...あなたのモデルを投稿してください - あなたはまずコードを使っていますか? – NSGaga

+0

私のモデルを掲載したいが、画像を投稿するのに十分な評判ポイントがないので説明しようとした。 – Joe24

答えて

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

私は思う(あなたがアーティストを置くとして)歌に関連付けられているアルバムを定義する必要がありますので、あなたが曲とアルバムの間に多くの関係に1を持っているので、これが起こると思いますあなたはSongエンティティがAlbumsの収集とAlbumエンティティが含まれている必要がありSongAlbum間の多対多の関係を持っている場合、これは

2

が最初に動作する可能性があり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"); 
       }); 
     } 

だからあなたの方法はこの1つのようになります。

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のエラーでstuckedされまし多くrelantionship(対応するナビゲーションプロパティを送信し、例外情報を取得されなかった)、それは重要です:

  • OnCreatingModelのマッピングは、対応する中間テーブルにマップしないと、edmxファイルで省略されているテーブルで、このobjectが結合を実行するのを見つけることができません。

  • エンティティとデータコンテキストを生成するためのツールを使用していて、私のケースではedmxファイルを変更すると、この「生成オブジェクト」がすべてリフレッシュされるため、初期状態とあなたのマッピング、あなたのデータ注釈とそのものは消去されます。

これが役立ちます。

関連する問題