0

最初にコードを使用するのではなく、ID と名前のフィールドを持つ artist というテーブル、id とタイトルのフィールドを持つ albums というテーブル、artist_id と album_id を持つ junction_artists_albums テーブルを作成しました。

ここに私のモデル/コンテキストクラスがあります:

アーティスト:

    public class Artist
{
    public int Id { get; set; }
    public string ArtistName { get; set; }

    public ICollection<Album> albums { get; set; }
}

アルバム:

    public class Album
{
    public int Id { get; set; }
    public string AlbumName { get; set; }

    public ICollection<Artist> artists { get; set; }


}

MusicDBContext:

    public class MusicDBContext : DbContext
{
    public MusicDBContext() { }

    public DbSet<Artist> Artists { get; set; }
    public DbSet<Album> Albums { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Album>().HasMany<Artist>(a => a.artists).WithMany(a => a.albums);
    }
}

ジャンクション テーブルが入力されていないため、これは機能しません。これがばかげた質問である場合は申し訳ありませんが、私は Entity Framework に非常に慣れていません。

4

1 に答える 1

1

いいえ、それほど愚かではありません。そして解決策は簡単です。

多対多のリレーションシップを扱う場合、リレーションシップ フィールドがない限り、ジャンクション テーブルを明示的に指定する必要はありません。たとえば、アーティストが制作したアルバムには、制作日などがある場合があります。

ここで行う必要があるのは、この方法で行ったことを少し変更することです

public class Artist
{
    public int Id { get; set; }
    public string ArtistName { get; set; }

    #region Navigation Properties
    public virtual ICollection<Album> Albums { get; set; }
    #endregion
}

public class Album
{
    public int Id { get; set; }
    public string AlbumName { get; set; }

    public virtual ICollection<Artist> Artists { get; set; }
}

これが何を意味するのか正確にはわかりませんが、OnModelCreating イベントのオーバーライドを削除できます

最初の EF コードのナビゲーション プロパティと外部キー仕様は、常に仮想プロパティであることに注意してください。

多対多のリレーションシップがある場合、関連するナビゲーション プロパティを指定するだけで、残りは EF によって処理され、両方の主キーを含むジャンクション テーブルが作成されます。前に説明したように、関係フィールドがいくつかある場合は、手動でジャンクション テーブルを作成し、キーと関係フィールドの両方を持つクラスを明示的に作成する必要があります。

EF には Conventions と呼ばれるものがあります。これは、慣れる一連の命名規則と、外部キーなどを明示的に設定するのに役立ついくつかのデコレータです。

于 2014-01-16T12:01:35.730 に答える