i有以下EF代码第一类,似乎正在工作。我还拥有初始化代码,将这些表格与其他地方的数据一起播种,这些数据很漫长,我希望(我希望(与我的问题无关紧要。或至少在我手动播种时,我会看到相同的行为问题。
请注意,这些表使用字符串作为主要键,而不是ID。另请注意,子类别表具有一个复合主键,其中包括父表,类别的主键,类别代码。这也许是老式的伊萨米什人,但这是我必须与之合作的,否则是合乎逻辑的。
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);
}
这种结构允许相同的子类别码(例如" contry"(用于不同类别代码,例如"康复"one_answers"维护"。数据样本如下:
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
请注意,我似乎需要指定一个默认构造函数来添加列表成员的实例化,否则此属性最终在实例化类别中被无效。
还要注意,我希望两个类都包括彼此的参考 - 即类别具有列表成员来保存其构成子类别数据,并且子类别具有一个类别成员来保留对父母的参考。
。在这里我有最大的问题。如果我只是执行以下操作,我将获得填充类别类别的列表;但是,每个对象的子类别对象的列表都是空的(不是null,但有0个项目(。现在,在我们责怪此处建立空列表的默认构造函数之前,请注意,如果没有该代码,每个类别实例都包含对其子类别列表的null引用。
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();
}
我缺少什么或以其他方式误解?
为什么 SubCategories
为null或0项,因为您不包含此关系的急切加载。如果要使用懒惰加载,则可以在导航属性中使用virtual
关键字:
懒惰加载:
public virtual List<SubCategory> SubCategories { get; set; }
急切的加载:
db.Categories.Where(c => c.CategoryCode == "FUND").Include(x => x.SubCategories ).ToList();
阅读更多。