MVC4模型属性应该是另一个类的列表或ICollection

时间:2013-06-30 16:30:14

标签: asp.net-mvc-4 ef-code-first

我正在使用Entity Framework代码优先创建一种测试生成应用程序。我有一个名为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.
}

有比这些更好的方法吗?如果没有,哪个更好,为什么?我很难在网上找到这些内容,而且大多数书籍都没有这么深入。 提前感谢任何指导。

2 个答案:

答案 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,因为它看起来像是最简单的解决方案,简单通常更好。如果您希望您的课程更好地代表您的数据库,那么这可能是制作单独的答案课程的理由。如果您希望将来扩展您的答案,那么这可能是在简单列表上选择单独的答案类的另一个原因。

一般情况下,我会说:如果你有两种方法可以解决问题,那么选择的方法就是让你的代码在查看代码时最容易阅读/理解的方法。