15

我很好奇是否可以通过包含对象映射中间表。

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 是否会对私有变量执行此操作。会吗?

我希望这样做是因为如果它必须公开以维护封装。

4

1 回答 1

39

您可以在 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());

您可能希望将_subscribedListprotected 设为虚拟,以允许延迟加载。但甚至可以使用以下方法进行预加载Include

context.Subscribers.Include("_subscribedList");
于 2012-12-10T22:58:03.183 回答