我正在使用Entity Framework代码优先创建一种测试生成应用程序。我有一个名为Question
的基类,MultipleChoiceQuestion
,EssayQuestion
和其他问题类型从中下降。 MultipleChoiceQuestions
显然有多个答案,测试者必须从中选择。我的问题与选择在问题实例中存储它们的最佳方式有关。
我可以使用字符串列表声明类来保存答案,如下所示:
public class MulitpleChoiceQuestion : Question
{
private List<String> Answers = new List<String>();
// other declarations, etc.
}
相反,我可以声明另一个名为Answers
的类,让我的Question
类使用一组Answers。
public class Answer
{
public int AnswerID { get; set; }
public String AnswerText { get; set; }
public virtual Question Question { get; set; }
}
然后在我的问题子类中(不只是MultipleChoiceQuestions
)
public class MulitpleChoiceQuestion : Question
{
public virtual ICollection<Answer> Answers { get; set; }
// other declarations, etc.
}
有比这些更好的方法吗?如果没有,哪个更好,为什么?我很难在网上找到这些内容,而且大多数书籍都没有这么深入。 提前感谢任何指导。
答案 0 :(得分:1)
我向我的一位.NET教授朋友询问了这个问题,这是他的回答:
您的两个声明都在调用集合。列表是键入的 ICollection无类型时收集。 Typed Collection(List)有 与无类型集合相比有两个优势。每个集合的类型 在编译时检查,从而防止运行时错误。第二, 它们减少了检索时所需的铸造量 对象。
我首先实现了ICollection解决方案,它在几个地方很笨拙(例如,种子数据的初始化程序):
var mcQuestions = new List<MultipleChoiceQuestion>
{
new MultipleChoiceQuestion {
QuestionText = "What is the value returned by the expression (true == false? 'yes': 'no')?",
Answers = new List<Answer> { new Answer { AnswerText="true"}, new Answer { AnswerText = "false"}, new Answer { AnswerText = "can't be determined"}, new Answer {AnswerText = "45"}, new Answer { AnswerText = "blue"}}
},
new MultipleChoiceQuestion {
QuestionText = "C-Sharp responds to a global variable declaration by:",
Answers = new List<Answer> { new Answer { AnswerText="throwing a compile error"}, new Answer { AnswerText = "throwing a runtime error"}, new Answer { AnswerText = "Throwing an Invalid operator warning"}, new Answer {AnswerText = "Printing a warning to the console"}, new Answer { AnswerText = "doing nothing; global variables are legal"}}
}
};
mcQuestions.ForEach(mcq => context.MultipleChoiceQuestions.Add(mcq));
context.SaveChanges();
虽然这个解决方案可能更灵活,但我认为从长远来看,List会更清洁,更易于维护。我无法想到将复杂性作为未来可能的灵活性的权衡取舍的理由。所以这是我的名单。 希望这有助于其他人。 祝你好运,还有好的代码。 Ĵ
答案 1 :(得分:0)
我还没有尝试过类似的东西,但是我希望EF能够将你的List转换成数据库端的单独Answers表,所以我希望这两种解决方案都能产生相同的数据库模型。在任何情况下,如果两种方法都有效,那么决定选择哪种方法将是一种品味问题。
就个人而言,我会选择List,因为它看起来像是最简单的解决方案,简单通常更好。如果您希望您的课程更好地代表您的数据库,那么这可能是制作单独的答案课程的理由。如果您希望将来扩展您的答案,那么这可能是在简单列表上选择单独的答案类的另一个原因。
一般情况下,我会说:如果你有两种方法可以解决问题,那么选择的方法就是让你的代码在查看代码时最容易阅读/理解的方法。