1 回答
TA贡献1841条经验 获得超3个赞
正如聊天中所讨论的,我很少相信 EF 的多对多功能,更不用说 EF Core。这不是直接针对您的问题,而是解释了如果这是我的项目我将如何处理。
您已经拥有ApplicationUser了,因此从它们中分离出来的表只会存在于定义不同ApplicationUsers. 每个用户可以拥有多个所有内容:关注者、关注者和阻止。用户并不直接控制谁跟随他们,所以不需要自己的表。您可以通过查看关注者表来确定谁关注了用户。
public class ApplicationUser : IdentityUser
{
public virtual ICollection<UserFollow> Following { get; set; }
public virtual ICollection<UserFollow> Followers { get; set; }
public virtual ICollection<UserBlock> BlockedUsers { get; set; }
}
public class UserFollow
{
public int Id { get; set; }
[ForeignKey(nameof(SourceUserId))]
public ApplicationUser SourceUser { get; set; }
public string SourceUserId { get; set; }
[ForeignKey(nameof(FollowedUserId))]
public ApplicationUser FollowedUser { get; set; }
public string FollowedUserId { get; set; }
}
public class UserBlock
{
public int Id { get; set; }
[ForeignKey(nameof(SourceUserId))]
public ApplicationUser SourceUser { get; set; }
public string SourceUserId { get; set; }
[ForeignKey(nameof(BlockedUserId))]
public ApplicationUser BlockedUser { get; set; }
public string BlockedUserId { get; set; }
}
然后你的配置不会有太大变化(考虑这个伪,未经测试):
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
moderlBuilder.Entity<UserFollow>()
.HasOne(l => l.SourceUser)
.WithMany(a => a.Following)
.HasForeignKey(l => l.SourceUserId);
moderlBuilder.Entity<UserFollow>()
.HasOne(l => l.FollowedUser)
.WithMany(a => a.Followers)
.HasForeignKey(l => l.FollowedUserId);
moderlBuilder.Entity<UserBlock>()
.HasOne(l => l.SourceUser)
.WithMany(a => a.BlockedUsers)
.HasForeignKey(l => l.SourceUserId);
}
(请注意,我总是使用一个简单的键(Id只是为了便于查询),但您可以根据需要将其改回复合键)
- 1 回答
- 0 关注
- 179 浏览
添加回答
举报