【问题标题】:How do I use a composite key for a one to many relationship in Code First EF如何在 Code First EF 中将复合键用于一对多关系
【发布时间】:2018-03-23 14:37:15
【问题描述】:

我首先使用 EF 代码。

我需要两个表,LedgerCategoriesLedgerSubCategories 具有一对多关系(类别 -> 子类别),每个表中的键都是代码(字符串) - 即分别为 LedgerCategoryCodeLedgerSubCategoryCode .但是,我需要允许不同类别的 SubCategoryCode 值相同。

例如CategoryCode = REHAB,SubCategoryCodes = MATL、CONTR 和 FEES;和 CategoryCode = MAINT、SubCategoryCodes = MATL、CONTR 和 FEES。

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

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 实例不包含它们各自的关联LedgerSubCategory 实例列表。

我试图避免在 LedgerSubCategories 中引入唯一编号或 Guid ID 字段作为 PK 并仅索引其他代码字段,这看起来像是一个杂项。我没有尝试过,但我不确定它是否会导致重新实例化 LedgerCategories 并获得关联 LedgerSubCategories 的任何不同结果。

感谢任何有关如何正确执行此操作并获得正确结果的建议。

【问题讨论】:

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


    【解决方案1】:

    我想,要回答我自己的问题,我发现在 Code First 框架建立所需的数据库架构时,使用 Fluent API 覆盖相应 DbContext 中的 OnModelCreating() 以建立一对多关系和外键。似乎没有其他方法可以做到这一点,例如使用属性。许多其他人(包括 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多