1

我对实体框架的代码优先方法的继承策略有疑问。

目前我必须在我们的数据库中实现各种问题表。

这是我当前的 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 表具有外键的附加表,因为它们没有其他属性。这似乎不对。

可能还有其他方法我可以尝试吗?

4

0 回答 0