首页 > 解决方案 > 如何在 .NET EF Core 中实现自引用多对多关系

问题描述

我正在制作一个作为社交网络的 Web 应用程序,并且在 EF Core(代码优先,SQL Server)创建模型的阶段遇到了问题。

我需要为用户添加添加好友的功能。所以,我试图建立一个像“自引用多对多”这样的连接。我看到了如何通过在课堂上创建一个额外的数组来解决这个问题,但是有没有办法绕过这个“拐杖”?

这是我User班级的代码:

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    // ... Other properties

    public ICollection<UserFriend> Friends { get; set; }
}

这是UserFriend课程:

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

    public int FriendId { get; set; }
    public User Friend { get; set; }
}

这也是我DbContext的及其OnModelCreating设置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<UserFriend>()
                .HasKey(i => new { i.UserId, i.FriendId });

    modelBuilder.Entity<UserFriend>()
                .HasOne(c => c.User)
                .WithMany(w => w.UserFriends)
                .HasForeignKey(f => f.UserId)
                .OnDelete(DeleteBehavior.Restrict);

    modelBuilder.Entity<UserFriend>()
                .HasOne(c => c.Friend)
                .WithMany(w => w.UserFriends)
                .HasForeignKey(f => f.FriendId)
                .OnDelete(DeleteBehavior.Restrict);
}

标签: c#.netsql-serverdatabaseentity-framework-core

解决方案


您在 User 中的集合应该是 Friend 类型,而不是 UserFriend。也让它虚拟:

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

推荐阅读