从EF开始,我正在使用EF,因为我正在C#上构建MVC应用程序。我希望不同类型的考试有不同类型的问题。这里是我的抽象类:是不是在考试类声明的典型public virtual ICollection<Question>
,我创建了一个抽象的setter和getter如何强制子类具有超类属性的特定子类?
public abstract class Exam
{
public int Id { get; set; }
public string Description { set; get; }
public abstract ICollection<Question> GetQuestions();
public abstract void SetQuestions(ICollection<Question> questions);
}
public abstract class Question
{
public int Id { get; set; }
public string Description { set; get; }
public abstract Exam getExam();
public abstract void setExam(Exam exam);
}
通知。 Question类的Exam属性也是如此。
这里是我的具体考试类:
[Table("SingleExam")]
public class SingleExam : Exam
{
public virtual ICollection<SingleQuestion> Questions { get; set; }
public override ICollection<Question> GetQuestions() { return Questions as ICollection<Question>; }
public override void SetQuestions(ICollection<Question> questions)
{
if (!(questions is ICollection<SingleQuestion>))
throw new ArgumentException("You must set single questions.");
Questions = questions as ICollection<SingleQuestion>;
}
}
[Table("MultipleExam")]
public class MultipleExam : Exam
{
public virtual ICollection<MultipleQuestion> Questions { get; set; }
public override ICollection<Question> GetQuestions() { return Questions as ICollection<Question>; }
public override void SetQuestions(ICollection<Question> questions)
{
if (!(questions is ICollection<MultipleQuestion>))
throw new ArgumentException("You must set multiple questions.");
Questions = questions as ICollection<MultipleQuestion>;
}
}
...我的具体问题类:
[Table("SingleQuestion")]
public class SingleQuestion : Question
{
public int ExamId { get; set; }
public virtual SingleExam Exam { get; set; }
public override Exam getExam() { return Exam; }
public override void setExam(Exam exam)
{
if (!(exam is SingleExam))
throw new ArgumentException("You must set a SingleExam");
Exam = exam as SingleExam;
}
}
[Table("MultipleQuestion")]
public class MultipleQuestion : Question
{
public int ExamId { get; set; }
public virtual MultipleExam Exam { get; set; }
public override Exam getExam() { return Exam; }
public override void setExam(Exam exam)
{
if (!(exam is MultipleExam))
throw new ArgumentException("You must set a MultipleExam");
Exam = exam as MultipleExam;
}
}
我所做的这一切都是因为一个MultipleExam应该只有MultipleQuestions和SingleExam应只有SingleQuestions,与MultipleQuestion应该有一个MultipleExam和Single问题应该有一个SingleExam相同的方式。
有没有更好的方法来确保类'A'的子类包含或具有类'B'的特定子类(就像我的考试和问题一样),并通过抽象类没有抽象的getters和setter?
为什么问题需要了解它所在的考试? – Servy
它们只是导航属性,但它们并不真正重要(尽管需要正确映射数据库的ExamId)。真正重要的是确保不同类型的考试包含特定的问题类别 –
除非您遗漏了关于单独(多/单)考试和(多/单)问题类型目的的其他细节,这种方法似乎已经结束-复杂。单一的考试和问题类不会更容易吗?如果您需要在单考和多考之间添加区别,您可以添加在构造函数中设置的bool单一属性,并控制考试是否只能有一个或多个问题。 – Richard