我首先使用 EF 代码。
我需要两个表,LedgerCategories
和具有一对多关系的LedgerSubCategories
(类别 ->子类别),每个表中的键都是代码(字符串) - 即 分别LedgerCategoryCode
和LedgerSubCategoryCode
。 但是,我需要允许不同类别的子类别代码值相同。
例如,CategoryCode = REHAB,SubCategoryCodes = MATL、CONTR 和 FEES;CategoryCode = MAINT,SubCategoryCodes = MATL、CONTR 和 FEES。
我想我需要使用复合键并在分类子类别表中包括类别代码和子类别代码字段。 目前我有:
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
的任何不同结果。
任何关于如何适当地做到这一点并获得适当结果的建议,我们将不胜感激。
我想,回答我自己的问题,我发现在相应的 DbContext 中使用 Fluent API 覆盖 OnModelCreateating() 以在代码优先框架建立所需的数据库模式时建立一对多关系和外键。 似乎没有其他方法可以做到这一点,例如使用属性。 根据包括MSDN在内的许多其他人的说法,Fluent API似乎是所需要的。 然而,这让我想到了一个新问题,或一系列问题,我在这里提出了一个问题。
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);
}