3

我正在使用实体框架代码优先制作一种测试生成应用程序。我有一个名为 的基类Question,从该基类MultipleChoiceQuestionEssayQuestion和其他问题类型下降。 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.
}

有没有比这两种方法更好的方法?如果不是,这些中哪一个更好,为什么?我很难在网上找到这么详细的东西,而且大多数书也没有这么深入。提前感谢您的任何指导。

4

2 回答 2

1

我问了我的一个 .NET 教授朋友这个问题,这是他的回答:

您的两个声明都在调用集合。列表是类型化的集合,而 ICollection 是无类型的。类型化集合(列表)与非类型化集合相比有两个优点。在编译时检查每个集合的类型,从而防止运行时错误。其次,它们减少了检索对象时所需的转换量。

我首先实现了 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 从长远来看会更干净,更易于维护。我想不出一个理由来保持复杂性作为未来可能的灵活性的权衡。所以这是我的清单。希望这对其他人有帮助。祝你好运,代码很好。Ĵ

于 2013-07-03T04:42:35.743 回答
0

我还没有尝试过类似的东西,但我希望 EF 将您的 List 变成数据库端的单独 Answers 表,因此我希望这两种解决方案都会产生相同的数据库模型。无论如何,如果这两种方法都有效,那么决定选择哪一种将是一个品味问题。

我个人会选择列表,因为它看起来是最简单的解决方案,而且简单通常更好。如果您希望您的类更好地代表您的数据库,这可能是制作单独的 Answer 类的原因。如果您希望将来扩展您的答案,这可能是另一个选择单独的答案类而不是简单列表的原因。

总的来说,我会说:如果您有两种解决问题的方法,那么选择的一种是使您的代码在查看代码时最容易阅读/理解的一种。

于 2013-07-03T06:44:36.697 回答