实体框架通过包含对象,多对多

Pro*_*ger 14 c# asp.net-mvc 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; }
}
Run Code Online (Sandbox Code Playgroud)

我需要有一个订阅者表,频道表和一个中间表来将订阅者链接到他/她的频道.

是否可以将ChannelList对象中的列表映射到订阅者模型?

我认为这可能是不可能的,我需要有一个私人列表供EF映射.但我不确定EF是否会为私有变量做这件事.会吗?

我希望这样做是因为如果必须公开来维护封装.

Ger*_*old 36

您可以先在EF代码中映射私有属性.是一个很好的描述如何做到这一点.在你的情况下,它是关于映射Subscriber._subscribedList.你不能做的是这个(在上下文的覆盖中OnModelCreating):

modelBuilder.Entity<Subscriber>().HasMany(x => x._subscribedList);
Run Code Online (Sandbox Code Playgroud)

它不会编译,因为它_subscribedList是私有的.

您可以做的是在以下位置创建嵌套映射类Subscriber:

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

    public class SubscriberMapper : EntityTypeConfiguration<Subscriber>
    {
        public SubscriberMapper()
        {
            HasMany(s => s._subscribedList);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在OnModelCreating:

modelBuilder.Configurations.Add(new Subscriber.SubscriberMapping());
Run Code Online (Sandbox Code Playgroud)

您可能希望使_subscribedList受保护的虚拟,以允许延迟加载.但是甚至可以通过以下方式进行急切加载Include:

context.Subscribers.Include("_subscribedList");
Run Code Online (Sandbox Code Playgroud)