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是否会为私有变量做到这一点。 会吗?
我希望这样做是因为如果必须公开来维护封装。
您可以先在EF代码中映射私有属性。 这是一个很好的描述如何做到这一点。 在您的情况下,它是关于Subscriber._subscribedList
的映射。 你不能做的是(在上下文中覆盖OnModelCreating
):
modelBuilder.Entity().HasMany(x => x._subscribedList);
它不会编译,因为_subscribedList
是私有的。
您可以做的是在Subscriber
创建一个嵌套的映射类:
public class Subscriber : IEntity { ... private ICollection _subscribedList { get; set; } // ICollection! public class SubscriberMapper : EntityTypeConfiguration { public SubscriberMapper() { HasMany(s => s._subscribedList); } } }
并在OnModelCreating
:
modelBuilder.Configurations.Add(new Subscriber.SubscriberMapping());
您可能希望使_subscribedList
保护虚拟,以允许延迟加载。 但是甚至可以使用Include
进行急切加载:
context.Subscribers.Include("_subscribedList");