Fluent API、Entity Framework Core の多対多 質問する

Fluent API、Entity Framework Core の多対多 質問する

私はstackoverflowで適切な解決策を検索しました。多対多EF Core、Code first、Fluent API を使用した関係。

簡単なシナリオは次のようになります。

public class Person
{
    public Person() {
        Clubs = new HashSet<Club>();
    }
    public int PersonId { get; set; }
    public virtual ICollection<Club> Clubs { get; set; }
}

public class Club
{
    public Club() {
        Persons = new HashSet<Person>();
    }
    public int ClubId { get; set; }
    public virtual ICollection<Person> Persons { get; set; }
}

間違っていたら訂正してください。しかし、説明されているツールを使用してこれを行う方法についての詳細な説明が含まれている質問は正直に言って見つかりませんでした。これをどのように行うのか説明できる人はいますか?

ベストアンサー1

EF Core 5.0 RC1+

EF Core 5.0 RC1 以降では、明示的な結合テーブルなしでこれを行うことができます。EF Core では、型を作成しなくても、質問に示されている多対多の関係のマッピングを構成できますPersonClub

見るEF Core 5.0、RC1、多対多の新機能詳細については公式ドキュメントをご覧ください。

以前のバージョン

EF Coreでは、結合に明示的なクラスを使用しないと、これはまだ不可能です。ここその方法の例については、こちらをご覧ください。

オープンな問題Github では、明示的なクラスを必要とせずにこれを行う機能を求めていますが、まだ完了していません。

あなたのシナリオを使用すると、私がリンクした例では次のエンティティ クラスが推奨されます。

public class Person
{
    public int PersonId { get; set; }
    public virtual ICollection<PersonClub> PersonClubs { get; set; }
}

public class Club
{
    public int ClubId { get; set; }
    public virtual ICollection<PersonClub> PersonClubs { get; set; }
}

public class PersonClub
{
    public int PersonId { get; set; }
    public Person Person { get; set; }
    public int ClubId { get; set; }
    public Club Club { get; set; }
}

OnModelCreatingセットアップには以下が使用されます。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<PersonClub>()
        .HasKey(pc => new { pc.PersonId, pc.ClubId });

    modelBuilder.Entity<PersonClub>()
        .HasOne(pc => pc.Person)
        .WithMany(p => p.PersonClubs)
        .HasForeignKey(pc => pc.PersonId);

    modelBuilder.Entity<PersonClub>()
        .HasOne(pc => pc.Club)
        .WithMany(c => c.PersonClubs)
        .HasForeignKey(pc => pc.ClubId);
}

必要だと感じた場合は、必ず私がリンクした未解決の問題にアクセスして、不満を表明してください。

編集: オープンイシューでは、このやや扱いにくい階層をナビゲートするためにシンプルな を使用することを提案しています。 からのコレクションSelectに移動するには、次のようにします。PersonIdClubSelectMany例:

var clubs = dbContext.People
    .Where(p => p.PersonId == id)
    .SelectMany(p => p.PersonClubs);
    .Select(pc => pc.Club);

これが本当に「ベスト プラクティス」であるかどうかは保証できませんが、確かに効果があるはずですし、それほど見苦しいものではないと言っても過言ではないと思います。

おすすめ記事