Как уже говорилось в чате, я редко доверяю возможностям EF для многим-многим, а не для EF Core.Это не прямой вопрос, а объясняет, как бы я справился с этим, если бы это был мой проект.
У вас уже есть ApplicationUser
, поэтому таблицы, которые с них исходят, будут существовать только для определенияотношения между различными ApplicationUsers
.Каждый пользователь может иметь несколько объектов: подписчиков, подписчиков и заблокированных.Однако пользователь не может напрямую контролировать, кто за ним следует, поэтому ему не нужна собственная таблица.Вы можете определить, кто следует за пользователем, просмотрев таблицу Follower.
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; }
}
Ваша конфигурация тогда не сильно изменится (рассмотрите этот psuedo, не проверенный):
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
просто для удобства запросов), но вы можете изменить его обратно на составной при необходимости)