EFコア - 多対多の関係

c# entity-framework-core many-to-many

質問

ユーザーフレンドの関係

私は答えを見つける

エンティティフレームワークコア:同じエンティティとの多対多の関係で、このようにしてください。

エンティティ:

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

    public virtual ICollection<Friend> Friends { get; set; }
}

public class Friend
{
    public int MainUserId { get; set; }

    public User ManUser { get; set; }

    public int FriendUserId { get; set; }

    public User FriendUser { get; set; }
}

流暢なAPI:

modelBuilder.Entity<Friend>()
    .HasKey(f => new { f.MainUserId, f.FriendUserId });

modelBuilder.Entity<Friend>()
    .HasOne(f => f.ManUser)
    .WithMany(mu => mu.Friends)
    .HasForeignKey(f => f.MainUserId);

modelBuilder.Entity<Friend>()
    .HasOne(f => f.FriendUser)
    .WithMany(mu => mu.Friends)
    .HasForeignKey(f => f.FriendUserId);

「Add-Migration」を選択すると、エラーメッセージは次のようになります。

'User.Friends'と 'Friend.FriendUser'の間には既に関係があるため、 'User.Friends'と 'Friend.FriendUser'の間に関係を作成することはできません。ナビゲーションプロパティは1つの関係にしか参加できません。

私は何をすべきか?または、Entity FriendEntity:Userを作成する必要がありますか?

受け入れられた回答

問題は、一対多の両方の関連付けをサポートするコレクションを1つ持つことができないことです。 Friendは2つの外部キーがあり、どちらも参照するエンティティに逆の終端が必要です。したがって、 MainUser逆の終わりとして別のコレクションを追加してMainUser

public class User
{
    public int UserId { get; set; }
    public virtual ICollection<Friend> MainUserFriends { get; set; }
    public virtual ICollection<Friend> Friends { get; set; }
}

そしてマッピング:

modelBuilder.Entity<Friend>()
    .HasKey(f => new { f.MainUserId, f.FriendUserId });

modelBuilder.Entity<Friend>()
    .HasOne(f => f.MainUser)
    .WithMany(mu => mu.MainUserFriends)
    .HasForeignKey(f => f.MainUserId).OnDelete(DeleteBehavior.Restrict);

modelBuilder.Entity<Friend>()
    .HasOne(f => f.FriendUser)
    .WithMany(mu => mu.Friends)
    .HasForeignKey(f => f.FriendUserId);

リレーションシップの1つ(または両方)は複数のカスケードパスを防ぐためにカスケード削除なしにする必要があります。


人気のある回答

2番目のコレクションは必須ではありません。このようにde .WithMany()を空のままにするだけです。

modelBuilder.Entity<Friend>()
    .HasOne(f => f.MainUser)
    .WithMany()
    .HasForeignKey(f => f.MainUserId);

modelBuilder.Entity<Friend>()
    .HasOne(f => f.FriendUser)
    .WithMany()
    .HasForeignKey(f => f.FriendUserId);

これを見てくださいhttps//github.com/aspnet/EntityFramework/issues/6052



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ