0

私は3つのテーブルを持っています。1つはアーティスト、もう1つはソング、もう1つはアルバムと呼ばれます。

アーティストは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;
    }
}
4

3 に答える 3

2

まず、多対多の関係がSongありAlbumSongエンティティに のコレクションを含める必要が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

これは、曲とアルバムの間に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;
    }
}

これでうまくいくと思います

于 2012-04-16T10:03:27.407 に答える
0

非常に良い答えalgreatです。EF 多対多の関係 (対応するナビゲーション プロパティが送信と例外であり、情報を取得していない) のエラーで立ち往生しているため、2 つの点を強調しておきましょう。

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

  • エンティティとデータ コンテキストを生成するためのツールを使用している場合 (これは私の場合です)、edmxファイルを変更すると、この「生成されたオブジェクト」はすべて初期状態とマッピングに更新されるため、おそらくこれを再度コーディングする必要があります。データの注釈とその内容は消去されます。

お役に立てれば!

于 2013-02-28T12:51:27.930 に答える