Модель подписчиков и подписок в EF

Мне надо сделать что-то типо модели подписок и подписчиков на YouTube. Есть юзер он может иметь подписчиков, так же он может и сам подписываться на юзеров.

public class User : BaseId
{
    public string Login { get; set; }   
    public virtual List<Subscription> Subscribers { get; set; }
    public virtual List<Subscriber> Subscription { get; set; }
}

public class Subscription : BaseId
{
    //info about publisher
    public int? UserId { get; set; }
    public virtual User User { get; set; }
    //info about subscriber
    public virtual User Subscriber { get; set; }
    public int? SubscriberId { get; set; }
}

public class Subscriber : BaseId
{
    //info about subscriber
    public virtual User User { get; set; }
    public int? UserId { get; set; }
    // link to subscription -> publisher
    public virtual Subscription Subscription { get; set; }
    public int? SubscriptionId { get; set; }
}

Сделал что-то такое, но при такой модели база не создается, вылетает ексепшинSystem.InvalidOperationException: "Unable to determine the relationship represented by navigation property 'Subscription.User' of type 'User'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'."

Как сделать такую модель правильно ? Чтобы все работало


Ответы (1 шт):

Автор решения: A K

Вам достаточно хранить в базе одну таблицу (помимо дефолтной Users): на кого подписались.

public class User
{
    // Кто подписан на User
    public virtual List<Subscription> MySubscribers  { get; set; }

    // На кого подписан User
    public virtual List<Subscription> MySubscriptions { get; set; }
}

public class Subscription
{
    // Кто подписался
    public int WhoId { get; set; }
    public User Who { get; set; }

    // На кого подписался
    public int ToWhomId { get; set; }
    public User ToWhom { get; set; }
}

При этом важно указать связи между сущностями:

public class SubscriptionConfiguration : IEntityTypeConfiguration<Subscription>
{
    public void Configure(EntityTypeBuilder<Subscription> builder)
    {
        builder.HasOne(x => x.ToWhom)
               .WithMany(x => x.MySubscribers)
               .OnDelete(DeleteBehavior.Restrict);

        builder.HasOne(x => x.Who)
               .WithMany(x => x.MySubscriptions)
               .OnDelete(DeleteBehavior.Restrict);
    }
}
→ Ссылка