Entity Framework «многие ко многим» не загружает связанные объекты - PullRequest
0 голосов
/ 10 мая 2019

У меня есть 2 класса сущностей с отношением «многие ко многим», определенными через FluentAPI. 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 Ответ

1 голос
/ 13 мая 2019

Благодаря Ивану Стоеву я обнаружил проблему: все мои классы сущностей были «внутренними» (а не «публичными» по умолчанию). Я хотел, чтобы они были скрыты внутри библиотеки, поскольку я использую преобразование из сущностей в бизнес-объекты, прежде чем передать их наружу. Это сделало следующий код необходимым:

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

Поскольку отношение «многие ко многим» создает отдельную таблицу сопоставления, явная инициализация этой таблицы отсутствовала, что приводило к тому, что EF упускал ленивую загрузку связанных сущностей. Поскольку я не знаю, как инициализировать таблицу, которую я не могу контролировать, я просто сделал все сущности «общедоступными», и проблема исчезла. Другое решение состояло бы в том, чтобы создать таблицу сопоставления самостоятельно, чтобы иметь возможность хранить все «внутренне» и инициировать ее самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...