EF Core - 課堂上的多對多關係

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);

當我添加遷移時,錯誤消息是

無法在'User.Friends'和'Friend.FriendUser'之間建立關係,因為'User.Friends'和'Friend.ManUser'之間已經存在關係。導航屬性只能參與單個關係。

我該怎麼辦?或者我應該創建一個Entity FriendEntity:User?

一般承認的答案

問題是你不能有一個集合來支持一對多的關聯。 Friend有兩個外鍵,它們都需要在它們引用的實體中使用反向結尾 。所以添加另一個集合作為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);

一個(或兩個)關係應該沒有級聯刪除以防止多個級聯路徑。


熱門答案

第二個系列不是強制性的。你只需要像這樣將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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow