Возможно, для других, я могу рассказать о том, что я только что узнал. Если не использовать виртуальную (или иначе ленивую загрузку) функцию .Include () в запросе будет идти только вглубь (в моем случае SubCategories). Виртуальное размещение везде сделает загрузку автоматически, везде. Рассмотрим большую иерархию БД, где все таблицы как-то связаны (не так уж необычно), и вы делаете запрос, чтобы получить список самых верхних записей таблицы. Ну, все эти записи будут иметь отношения, как и те, и так далее. В результате получается большой запрос с тяжелым результатом, когда требуется маленький результат.

я есть следующие классы EF Code First, которые, кажется, работают до определенной степени. У меня также есть код инициализации, который заполняет эти таблицы данными из других источников, которые длинны и кажутся (я надеюсь) несущественными для моего вопроса. Или, по крайней мере, когда я сею вручную, я вижу ту же проблему поведения.

Обратите внимание, что в этих таблицах в качестве первичных ключей используются строки, а не идентификаторы. Также обратите внимание, что таблица SubCategory имеет составной первичный ключ, который включает родительскую таблицу, первичный ключ Category, CategoryCode. Это, возможно, старая школа, ISAMish, но это то, с чем мне приходится работать, и это логично.

public class Category
{
  [Key]
  public string CategoryCode { get; set; }
  public string Description { get; set; }

  public List<SubCategory> Sub Categories { get; set; }

  public Category()
  {
    this.SubCategories = new List<SubCategory>();
  }
}

public class SubCategory
{
  [Key, Column(Order = 0)]
  public string CategoryCode { get; set; }
  [Key, Column(Order = 1)]
  public string SubCategoryCode { get; set; }
  public string Description { get; set; }
  public Category Category { get; set; }

  public SubCategory() { }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  // Configures the one-many relationship between Categories and 
  //   SubCategories, and established the Foreign Key in SubCategories
  modelBuilder.Entity<Category>()
    .HasMany<SubCategory>(c => c.SubCategories)
    .WithRequired(s => s.Category)
    .HasForeignKey<string>(s => s.CategoryCode);
}

Эта структура позволяет одному и тому же SubCategoryCode, скажем, «CONTR», использоваться более одного раза для разных кодов категорий, таких как «REHAB» и «MAINT». Пример данных выглядит так:

Categories

CategoryCode    Description
==================  =========================
BANK    Costs of banking fees and expenses
FUND    Funding Loans/Pmnts
INSUR   Property Insurance
MAINT   Maintenance Expenses
REHAB   Rehabilitation & Renovation Expenses

SubCategories

CategoryCode    SubCategoryCode Description
==================  =====================   ===========
FUND    LOAN    Monies borrowed to Entity
FUND    PMNT    Monies paid back by Entity
INSUR   BUILD   Builders Risk policy, including liability
INSUR   LANDL   Landlord policy, including liability
INSUR   MISC    Miscellaneous/Other
MAINT   CONTR   Contractor invoices, (labor, Materials, fees)
MAINT   MATL    Materials & Tooling
REHAB   CONTR   Contractor invoices, (labor, Materials, fees)
REHAB   MATL    Materials & Tooling

Обратите внимание, что мне, кажется, нужно указать конструктор по умолчанию, чтобы добавить создание экземпляра элемента List, или это свойство заканчивается в null в экземплярах классов Category.

Также обратите внимание, что я хочу, чтобы оба класса включали ссылки друг на друга - т. Е. В категории есть член List для хранения входящих в него данных подкатегории, а в подкатегории есть член Category для хранения ссылки на своего родителя.

Именно здесь у меня самая большая проблема. Если я просто выполню следующее, я получу список заполненных классов Category; однако, каждый из объектов List объектов SubCategory является пустым (не нулевым, а с 0 элементами). Теперь, прежде чем винить конструктор по умолчанию, устанавливающий здесь пустой список, обратите внимание, что без этого кода каждый из экземпляров Category содержит нулевую ссылку на свой список подкатегорий.

using (var db = new BusinessDBContext())
{
  var Categories = db.Categories.Where(c => c.CategoryCode == "FUND").ToList();
}

Но если я добавлю создание экземпляра списка подкатегории, категории в списке категорий теперь будут иметь заполненные списки подкатегорий внутри. Их там нет, пока я не создаю экземпляр подкатегории. И, похоже, не имеет значения, происходит ли это до или после запроса категорий.

using (var db = new BusinessDBContext())
{
  var Categories = db.Categories.Where(c => c.CategoryCode == "FUND").ToList();
  var SubCategories = db.SubCategories.Where(s => s.CategoryCode == "FUND").ToList();
}

Что я упускаю, или иначе недоразумение?

Ответы на вопрос(1)

Ваш ответ на вопрос