实体框架多对多未加载相关实体

时间:2019-05-10 15:19:57

标签: entity-framework many-to-many ef-fluent-api

我必须通过FluentAPI定义2个具有多对多关系的实体类。 Entity1具有带有相关Entity2-对象的虚拟集合。 Entity2没有此集合,因为我不需要它。 我的课程如下:

  internal class Franchisee : UserAccount //abstract base class with more properties
  {
        public virtual ICollection<FranchiseOffice> FranchiseOffices { get; set; } 
  }

  internal class FranchiseOffice: Office //abstract base class
  {
        <many properties, but no collection for Franchisee-objects>
  }

多对多关系的配置:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<CoreModel, Migrations.Configuration>());

            //many-to-many relationship with only one navigation property
            modelBuilder.Entity<Franchisee>().HasMany(u => u.FranchiseOffices).WithMany().Map(m =>
            {
                m.MapLeftKey("FranchiseeId");
                m.MapRightKey("FranchiseOfficeId");
                m.ToTable("FranchiseOffices");
            });
  }

有效的方法:保存实体并通过导航属性将它们链接在一起。数据库中的数据看起来不错;映射表“ FranchiseOffices”就在其中并充满了数据。

什么不起作用:当我加载特许经营者时,尽管数据库中存在数据,但集合'FranchiseOffices'为NULL。

我可以看到的与在线示例的唯一区别是我都在使用继承的类。我尝试显式查询子类,但结果是相同的。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

由于Ivan Stoev,我发现了问题:我的所有实体类都是“内部”的(默认情况下不是“公共”的)。我想将它们隐藏在库中,因为在将它们传递给外部之前,我使用了从实体到业务对象的转换。 这使以下代码成为必需:

  public CoreModel() : base("name=DefaultConnection")
  {
            //manually init the DbSets because they are 'internal' which prevents automatic init
            UserAccounts = Set<UserAccount>();
            Offices = Set<Office>();
   }

由于多对多关系创建了单独的映射表,因此缺少该表的显式初始化,这导致EF错过了相关实体的延迟加载。由于我不知道如何初始化无法控制的表,因此我只是使所有实体“公开”,问题消失了。 另一个解决方案是自己创建映射表,以便能够将所有内容保持在“内部”并自己进行初始化。