0


我有以下模型,不使用继承:

问题类:

    public int QuestionId { get; set; }
    public string QuestionTitle { get; set; }
    public bool Required { get; set; }
    public int questionType { get; set; }
    [ScriptIgnore]
    public virtual ICollection<TextAnswer> TextAnswers { get; set; }
    [ScriptIgnore]
    public virtual ICollection<ParagraphAnswer> ParagraphAnswers { get; set; }
    [ScriptIgnore]
    public virtual ICollection<Choice> Choices { get; set; }
    [ScriptIgnore]
    public virtual ICollection<ChoiceAnswer> ChoiceAnswers { get; set; }

我应该使用继承来回答吗?
那是,

TextAnswer : Answer
ParagraphAnswer : Answer
ChoiceAnswer : Answer

这样 Question 类只有一个 ICollection 吗?
你会建议我什么?

4

3 回答 3

1

是的,对此进行建模的正确方法是使用继承。

请注意,您可以选择如何将继承映射到表(TPH、TPT),并且对于复杂的多级层次结构,您可能需要关注性能。

于 2012-08-29T18:36:07.527 回答
0

是的。这就是JAVA中继承的优势。通过这种方法,您将为您的代码实现良好的设计。

您的代码将对新的增强和扩展开放,代码更改较少,因为单独的基类将针对任何新的 ANSWER 类进行扩展,并且在问题类中不需要进行任何更改。

于 2012-08-29T17:56:35.853 回答
-2

我在继承和实体框架方面的经验相当差。在特定情况下(我不想在这里详细介绍)由 EF 生成的查询大小约为 1Mb。(我不是在谈论结果 - 只是查询文本!)

最近(大约 6 个月)我开始使用 NHibernate。在我的公司,我们有一个作为产品开发的软件——这意味着每个实体至少有 3-4 级继承。NHibernate 可以很好地应对它——您可能想尝试一下。

至于 EF:不,不要使用继承。这个项目还不够成熟。

//因为不赞成而编辑:我从第一个版本开始就一直在使用 Entity Framework,包括核心内容,例如为 Visual Studio 编写自定义“自定义工具”以从 EDMX 文件生成代码。自定义生成器添加了对存储过程和适当延迟加载(在 EF 1.0 中被破坏)等的支持。

然后是 EF 2.0 和巨大的变化。我在几个项目中使用过 EF。在其中之一中,我们要求所有实体都有一个基类。这又是一次硬核黑客攻击,这就是出现大量查询文本的情况。如果您想再次否决我的答案,请随意这样做,但仅仅因为您的案例并不复杂(如果我们无论如何都可以将基类称为复杂案例..)并不意味着 EF 是成熟的和稳定的ORM。

于 2012-08-29T18:26:31.403 回答