Модель подписчиков и подписок в 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 шт):
Вам достаточно хранить в базе одну таблицу (помимо дефолтной 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);
}
}