我正在使用EF Code First。
我需要两个表,LedgerCategories
和LedgerSubCategories
具有一对多关系(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
的任何不同结果。
对于如何恰当地做到这一点并获得正确结果的任何建议表示赞赏。
答案 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);
}