c# - 如何在 .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);
}
解决方案
您在 User 中的集合应该是 Friend 类型,而不是 UserFriend。也让它虚拟:
public virtual ICollection<Friend> Friends {get;set;}
推荐阅读
- php - PDO - SQLServer 更改最大数据限制
- javascript - 覆盖来自外部库的 HTML img 标记的 src 图像
- azure - Azure 设计和连接
- regex - 如何将 HTTP 重定向到 HTTPS 并在同一重写规则中删除 .html?
- php - php - 如何过滤掉值并将它们打印到另一个数组中
- javascript - 与 Photoshop UI 布尔语法混淆
- javascript - 创建列表项 Sharepoint REST API Javascript 返回错误 500
- xml - 我如何将 XLST 日期从 2020-12-30 转换为 20201230
- python - 使用 Python 分隔频率并多次写入值 (7895 7895 7895 7895) 而不是 (4*7895)
- r - 在R中查找小时和分钟的时差