通过一对多关系重新恢复EF课程和字符串的复合关键



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

阅读更多。

相关内容

最新更新