web-dev-qa-db-ja.com

Entity Framework Core:同じエンティティとの多対多の関係

私は同じエンティティに多対多の関係をマッピングしようとしています。 Userエンティティには、Contactsの_IList<User>_データフィールドがあり、ユーザーの連絡先/友人情報を保存します。

_public class User : DomainModel
{
    public virtual IList<User> Contacts { get; protected set; }
    //irrelevant code omitted
}
_

流れるようなAPIを使用してこの多対多の関係をマッピングしようとすると、問題が発生します。どうやら、_user.Contacts_プロパティでHasMany()を使用すると、次に呼び出すWithMany()メソッドがありません。 Visual Studioのインテリセンスでは、WithOne()のみが表示され、WithMany()は表示されません。

_modelBuilder.Entity<User>().HasMany(u => u.Contacts).WithMany() 
// gives compile time error: CS1061 'CollectionNavigationBuilder<User, User>' does not contain a definition for 'WithMany' and no extension method 'WithMany' accepting a first argument of type 
_

なぜこれが起こるのですか?この多対多の関係をマップするために間違ったことはありますか?

16
Lord Yggdrasill

なぜこれが起こるのですか?この多対多の関係をマップするために間違ったことはありますか?

いいえ、あなたは何も間違っていませんでした。 サポートされていません 。現在のステータス ここ

結合テーブルを表すエンティティクラスのない多対多の関係はまだサポートされていません。ただし、結合テーブルのエンティティクラスを含め、2つの個別の1対多リレーションシップをマッピングすることにより、多対多リレーションシップを表すことができます。

EF-Coreでは、マッピングテーブルのエンティティを作成する必要があります。 UserContactsなど。コメントで述べたように、 docs の完全な例。実際に以下のコードをテストしたことはありませんが、次のようになります。

public class UserContacts
{
    public int UserId { get; set; } 
    public virtual User User { get; set; }

    public int ContactId { get; set; } // In lack of better name.
    public virtual User Contact { get; set; }
}

public class User : DomainModel
{
    public List<UserContacts> Contacts { get; set; }
}

そして、modelBuilder

  modelBuilder.Entity<UserContacts>()
        .HasOne(pt => pt.Contact)
        .WithMany(p => p.Contacts)
        .HasForeignKey(pt => pt.ContactId);

    modelBuilder.Entity<UserContacts>()
        .HasOne(pt => pt.User)
        .WithMany(t => t.Contacts)
        .HasForeignKey(pt => pt.UserId);
23
smoksnes