Подтвердить что ты не робот

Entity Framework Многие для многих с помощью объекта

Мне было любопытно, можно ли сопоставить промежуточную таблицу через содержащий объект.

public class Subscriber : IEntity
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    private ChannelList _subscribedList { get; set; }
    public int NumSubscribedChannels { get { return _subscribedList.Count(); } }
}

public class HelpChannel : IEntity
{
    [Key]
    public int Id { get; set; }
    public string name { get; set; }
    public string category { get; set; }
    public int group { get; set; }
}

Мне нужно иметь таблицу подписчиков, таблицу каналов и промежуточную таблицу, чтобы связать абонента с его/ее каналами.

Можно ли сопоставить список, который находится в объекте ChannelList, с моделью подписчика?

Я подумал, что, вероятно, не возможно, и что мне нужно просто иметь частный список для EF для отображения. Но я не был уверен, что EF сделает это для частных переменных. Будет ли это?

Я надеюсь, что это так, потому что, если он должен быть общедоступным для поддержки инкапсуляции.

4b9b3361

Ответ 1

Вы можете сопоставить частные свойства в EF-кодах. Здесь хорошее описание, как это сделать. В вашем случае речь идет о отображении Subscriber._subscribedList. То, что вы не можете сделать, это это (в контексте переопределения OnModelCreating):

modelBuilder.Entity<Subscriber>().HasMany(x => x._subscribedList);

Он не будет компилироваться, потому что _subscribedList является закрытым.

Что вы можете сделать, это создать класс вложенных сопоставлений в Subscriber:

public class Subscriber : IEntity
{
    ...
    private ICollection<HelpChannel> _subscribedList { get; set; } // ICollection!

    public class SubscriberMapper : EntityTypeConfiguration<Subscriber>
    {
        public SubscriberMapper()
        {
            HasMany(s => s._subscribedList);
        }
    }
}

и OnModelCreating:

modelBuilder.Configurations.Add(new Subscriber.SubscriberMapping());

Возможно, вы захотите сделать _subscribedList protected virtual, чтобы позволить ленивую загрузку. Но даже можно сделать загрузку с Include:

context.Subscribers.Include("_subscribedList");