【问题标题】:Entity Framework Many to many through containing object实体框架多对多通过包含对象
【发布时间】:2012-12-10 19:01:30
【问题描述】:

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

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

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

【问题讨论】:

  • 能否澄清一下你的这句话:Is it possible to map the list that is within the ChannelList object to the Subscriber Model?
  • ChannelList 是什么类型?我不认为你可以用 EF 映射它。如果是私有的,您将如何向订阅者添加频道?
  • ChannelList 只是一个包含 List 的对象。
  • 我希望订阅者拥有他们订阅的频道列表。但我更愿意与这个 ChannelList 对象进行交互,因为它封装了数据,并且因为这些列表太多,我希望所有代码都在一个地方与其中一组一起工作。我只是不确定如何让 EF 映射这些关系,而无需直接访问列表,该列表将在正常的 EF 中公开,很多可能设置。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

您可以在 EF 代码优先中映射私有属性。 Here 很好地描述了如何做到这一点。在您的情况下,它与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 设为受保护虚拟,以允许延迟加载。但甚至可以使用Include 进行预加载:

context.Subscribers.Include("_subscribedList");

【讨论】:

  • 那么我只需将该 Icollection 传递给 ChannelList 对象以保留封装?我需要在 HelpChannel 模型上做类似的事情吗?因为如果您在两个模型中都没有相反类型的公共集合,那么它不会使中间表以多对多的方式将它们关联在一起。
  • 我是否纠正了这种方法无法使用关系执行 linq-to-entities 查询? (因为实际相关的集合不是公开的,而公开的接口不是实体导航属性?
  • 是的,这是结果。
  • @Saibot 仍然有效。当然我不知道你到底做了什么。
猜你喜欢
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多