我参与了一个项目,我们使用 Entity Framework Code First 将现有的 C# 代码映射到数据库。我不打算在这里重现代码本身,但我将展示一些应该涵盖相同问题的伪代码。
我正在尝试将一个类映射到具有其他类列表的数据库。我将向您展示一个示例:
public Class ListClass
{
public List<SubClassA> ListOne
{
get { return BaseClass.OfType<SubClassA>().Where(b => !b.BoolOne && b.BoolTwo).ToList(); }
}
public List<SubClassA> ListTwo
{
get { return BaseClass.OfType<SubClassA>().Where(b => b.BoolOne && b.BoolTwo).ToList(); }
}
}
public abstract class BaseClass
{
public bool BoolOne {get; set;}
#Region EF
public GUID PrimaryKey {get; set;}
public GUID ListClassForeignKey {get; set;}
#EndRegion
}
public class SubClassA : BaseClass
{
public bool BoolTwo {get; set}
}
Class SubClassB : BaseClass
{
//Contents..
}
摘要: ListClass 包含 SubClassA 的列表。BaseClass 和 SubClassA 对 ListClass 一无所知。添加 BaseClass 中的 GUID 属性以与实体框架一起使用,否则不会更改现有类。这就是我们在这个项目中使用 Fluent API 的原因:
class ListClassConfiguration : EntityTypeConfiguration<ListClass>
{
public ListClassConfiguration()
{
HasKey(f => f.PrimaryKey);
Property(f => f.PrimaryKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasMany(f => f.ListOne).WithOptional().HasForeignKey(f => f.ListClassForeignKey);
HasMany(f => f.ListTwo).WithOptional().HasForeignKey(f => f.ListClassForeignKey);
}
}
在 Context-class 中,我们只需添加此配置。每当模型更改时,数据库就会被删除。我目前正在为 BaseClass 及其子类使用 TPH 映射。
当我尝试使用列表中的引用对象添加和保存 ListClass 时,我得到了这个异常:
无效操作异常。外键组件“ListClassForeignKey”不是“SubClassA”类型的声明属性。验证它没有被明确地从模型中排除,并且它是一个有效的原始属性。
那么,有什么建议吗?
编辑:我注意到在实际项目中,似乎有空列表。我试图删除配置类中的外键,我得到了一个没有内容的数据库表(一行中只有 NULL 值)。在此示例中,这意味着名称为“BaseClass”的 TPH 表仅为空/只有 NULL 值。这能解释一些问题吗?