Restabelecendo classes EF com relacionamento um para muitos e chave composta de strings

Eu tenho as seguintes classes First Code EF, que parecem estar funcionando até certo ponto. Eu também tenho um código de inicialização que semeia essas tabelas com dados de outros lugares que são longos e parecem (espero) irrelevantes para minha pergunta. Ou, pelo menos, quando eu proponho manualmente, vejo o mesmo problema de comportamento.

Observe que essas tabelas usam cadeias de caracteres como chaves primárias e não IDs. Observe também que a tabela SubCategory possui uma chave primária composta que inclui a tabela pai, a chave primária da categoria, CategoryCode. Esta é, talvez, a velha escola, ISAMish, mas é com isso que tenho que trabalhar e é lógico.

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);
}

Essa estrutura permite que o mesmo SubCategoryCode, digamos "CONTR", seja usado mais de uma vez para diferentes CategoryCodes, como "REHAB" e "MAINT". Uma amostra de dados fica assim:

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

Observe que eu parecia precisar especificar um construtor padrão para adicionar instanciação do membro List, ou essa propriedade acaba sendo nula nas classes de categoria instanciadas.

Observe também que desejo que as duas classes incluam referências umas às outras - ou seja, Category tem um membro da List para armazenar seus dados constituintes da Subcategoria e SubCategory tem um membro da Category para manter uma referência ao pai.

É aqui que tenho o maior problema. Se eu apenas executar o seguinte, recebo Lista de classes de Categoria preenchidas; no entanto, a lista de objetos de subcategoria de cada um desses objetos está vazia (não nula, mas com 0 itens). Agora, antes de culparmos o construtor padrão que estabelece a lista vazia aqui, observe que, sem esse código, cada instância da categoria contém uma referência nula à sua lista de subcategorias.

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

Mas, se eu adicionar uma instância de uma lista de subcategorias, as categorias na lista de categorias agora terão listas preenchidas de subcategorias. Eles não estão lá até eu instanciar as subcategorias. E, não parece importar se isso acontece antes ou depois da consulta para Categorias.

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();
}

O que estou faltando, ou outro mal-entendido?

questionAnswers(1)

yourAnswerToTheQuestion