我对实体框架的代码优先方法的继承策略有疑问。
目前我必须在我们的数据库中实现各种问题表。
这是我当前的 QuestionBase 类,它具有每种问题所需的所有属性。
public class QuestionBase
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int QuestionId { get; set; }
[Required]
public QuestionType QuestionType { get; set; }
public string ShortDescription { get; set; } = string.Empty;
[Required(AllowEmptyStrings = true)]
public string QuestionText { get; set; } = string.Empty;
[Required]
public double MaxScore { get; set; }
public bool MixedAnswers { get; set; } = true;
}
目前我只有两种不同类型的问题:SingleChoice 和 MultipleChoice。这些类型之间的唯一区别是导航属性,如下所示:
public class SingleChoiceQuestion : QuestionBase
{
public virtual List<SingleChoiceAnswer> Answers { get; set; }
}
public class MultipleChoiceQuestion : QuestionBase
{
public virtual List<MultipleChoiceAnswer> Answers { get; set; }
}
我当前的方法导致每个层次结构继承表。一旦我添加了一个包含附加属性的新问题类型,QuestionBase 表就会被附加列扩展。这不是我想要的。
每个类型的表继承不是一个选项,因为我不知道将来会添加多少不同的问题类型。恐怕,不同问题类型的数量可能会导致性能问题。
每个具体类继承的表也不是我想要的。
我还考虑过不使用继承,而是使用外键和导航属性。但后来我意识到,至少我的前两个问题类型会导致仅针对 QuestionBase 表具有外键的附加表,因为它们没有其他属性。这似乎不对。
可能还有其他方法我可以尝试吗?