Возможно, для других, я могу рассказать о том, что я только что узнал. Если не использовать виртуальную (или иначе ленивую загрузку) функцию .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();
}
Что я упускаю, или иначе недоразумение?