C# EntityFramework,我应该使用继承吗?

C# EntityFramework,我应该使用继承吗?,c#,entity-framework,C#,Entity Framework,我有以下模型,不使用继承: 问题类别: 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

我有以下模型,不使用继承: 问题类别:

    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; }
这样问题类就只有一个ICollection了?
你有什么建议吗?

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


您的代码将对新的增强和扩展开放,代码更改更少,因为任何新的答案类都将单独扩展基类,并且问题类中不需要任何更改。

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

最近大约6个月,我开始使用NHibernate。在我的公司,我们有一个作为产品开发的软件,这意味着每个实体至少有3-4个继承级别。NHibernate处理得很好——你可能想试试

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

//由于投票被否决而进行编辑: 从第一个版本开始,我就一直在使用EntityFramework,包括一些核心功能,比如为VisualStudio编写自定义工具,从EDMX文件生成代码。自定义生成器增加了对存储过程和适当延迟加载的支持,这在EF1.0和其他版本中被破坏


然后是EF2.0和巨大的变化。我在几个项目中使用了EF。在其中一个例子中,我们要求所有实体都有一个基类。这是又一次铁杆黑客攻击,而这正是巨大查询文本的情况发生的时候。如果你想再次否决我的答案,请尽管这样做,但仅仅因为你的案例没有那么复杂,如果我们可以把拥有一个基类称为一个复杂的案例。。这并不意味着EF是一个成熟和稳定的ORM。

是的,正确的建模方法是继承


请注意,您可以选择如何将继承映射到表TPH、TPT以及复杂的多级层次结构。您可能希望关注性能。

对于一般OOP主体来说,这是正确的,但这个问题是关于实体框架中的C。添加最少的添加版本号和一些he模型的指示。我计划在问题TextQuestion,ChoicesQuestion。。答案上的TPT对于早期版本的EF来说可能是正确的,但我在EF 4.x中有很好的继承经验。仅仅因为您的案例过于复杂并不意味着EF不是一个成熟和稳定的ORM。在几乎所有的企业应用程序中,为您的实体提供基类都是必须的。。在当前项目中,这是必须的,因为每个实体都有versionoptimistic并发和审计字段createdon、createdby、modifiedon、modifiedby。这是一个非常复杂的案件吗?
TextAnswer : Answer
ParagraphAnswer : Answer
ChoiceAnswer : Answer