如何在Code First EF中使用复合键来实现一对多关系

时间:2018-03-23 14:37:16

标签: sql-server entity-framework ef-code-first

我正在使用EF Code First。

我需要两个表,LedgerCategoriesLedgerSubCategories具有一对多关系(Categories - > SubCategories),每个表中的键都是代码(字符串) - 即{{1分别和LedgerCategoryCode。但是,我需要允许SubCategoryCode值对于不同的类别是相同的。

E.g。 CategoryCode = REHAB,SubCategoryCodes = MATL,CONTR和FEES;和CategoryCode = MAINT,SubCategoryCodes = MATL,CONTR和FEES。

我认为我需要使用复合键并在LedgerSubCategories表中包含CategoryCode和SubCategoryCode字段。目前我有:

LedgerSubCategoryCode

我只使用public class LedgerCategory { [Key] public string LedgerCategoryCode { get; set; } public string Description { get; set; } public List<LedgerSubCategory> LedgerSubCategories { get; set; } } public class LedgerSubCategory { [Key, Column(Order = 0)] public string LedgerCategoryCode { get; set; } [Key, Column(Order = 1)] public string LedgerSubCategoryCode { get; set; } public string Description { get; set; } } 类的实例播种这些表,每个实例包含一个适当实例化的LedgerCategory类的列表。这似乎都正确地设置了数据库模式(在我看来),并适当地填充两个表。

但是,当我重新实现一个简单的LedgerSubCategory列表,即

LedgerCategory

using (var db = new BusinessLedgerDBContext()) { var LedgerCategories = db.LedgerCategories.ToList(); } 个实例不包含各自关联的LedgerCategory个实例列表。

我试图避免,似乎是一个kludge,在LedgerSubCategory中引入一个唯一的数字或Guid ID字段作为PK,并且只是索引其他Code字段。我还没试过这个,但我不确定这会导致重新定位LedgerSubCategories并获得关联LedgerCategories的任何不同结果。

对于如何恰当地做到这一点并获得正确结果的任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

我想,回答我自己的问题,我发现在使用Fluent API在相应的DbContext中覆盖OnModelCreating(),以便在Code First框架建立所需的DB Schema时建立一对多关系和外键。似乎没有其他方法可以做到这一点,例如使用属性。通过许多其他人的帐户,包括MSDN,Fluent API似乎就是所需要的。然而,这导致我出现了一个新问题或一系列问题,我将其作为一个问题提出here

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