Sve*_*ang 18 .net inheritance entity-framework extending entity-framework-4
每种方法有哪些优点/缺点?
我知道我已经在书籍或本网站的某处读过为什么使用表继承对于Entity Framework 4来说很糟糕.
例如,为什么不创建一个具有entityId,datecreated,datemodified的表,然后让其他所有类继承实体框架中的那个?然后我的所有其他实体的表不需要这些列.然后我可以让一个人类继承那个基类,然后一个特定的人继承人.
除了编写一个较小的SQL脚本来生成数据库之外,我不确定这个的好处......
我看到的缺点是,它直接在SQL中查询/查看数据是一个很大的痛苦(所有相关信息在这么多表中被打破),我也问过我的朋友说:
更改应用程序代码比更改和迁移数据库数据更容易,因为大多数经验不足的开发人员接近他们接受继承的问题.我第一次开始开发的时候也是这样做的.它在逻辑上是有道理的.但是,一旦开发很长一段时间,你就会发现委托是最好的方法(服务在soa的情况下调用服务),而且单一用途的服务提供了比继承更多的重用."
这对我来说也很有意义.
所以
1)一般来说,继承与扩展的利弊是什么
2)在上面的具体例子中,什么更合适?
3)如果我的例子对于其中一个或两个都很糟糕,那么使用继承和使用扩展的好例子是什么?
我之前使用过这两种情况,但由于我远没有经验丰富,我仍然不确定如何处理所有情况.
10个投票,8个收藏,超过100个观点,没有人可以扩展?=(.
小智 9
我参加派对的时间有点晚了,但我对EF的继承问题一直有同样的问题,并为你找到了一个很好的总结.这是朱莉·勒曼(Julie Lerman)的"编程实体框架"(Programming Entity Framework)一书的摘录.
阅读之后,这是我对这个主题的结论:
1)一般来说,继承与扩展的优缺点是什么 - 优点实际上取决于您选择的表策略.请参见如何选择继承策略 - MSDN博客.但是,假设您已经决定使用继承,它们只是"专业人士".这不是一个轻率的决定.
缺点很多,但最大的是无法将现有实体作为派生实体添加到数据库中.例如:我有一个继承自Person的学生.John Smith有一个Person记录.一段时间后,我需要John Smith成为一名学生.太糟糕了.那是不可能的.(至少不能在没有存储过程的情况下绕过EF).
2)在我上面的具体例子中,哪个更合适? - 在您的示例中,您应该将这些列(entityId,datecreated,datemodified)添加到需要它们的表中.您可以使用复杂类型进行datecreated和datemodified,但除非您是一个非常严格的DRY家伙,否则这不是必需的.即便如此,它可能有点矫枉过正.原因是,一旦有了实体,就永远不能将该实体添加到另一个派生表中.一个人(这是一个BaseEntity)以后不能作为学生添加.另外,编写LINQ查询会比需要复杂得多.Alex已经证明了这一点.
3)如果我的例子对于其中一个或两个都很糟糕,那么使用继承和使用扩展的好例子是什么?- 通常,如果您可以创建基类型抽象,继承可能适合您.但你应该首先考虑其他选择.如果您的基本类型将直接在某处实例化,只需使用组合.在实际查询和插入记录时,继承变得非常麻烦.
总之,仅仅因为你可以在EF中进行继承并不意味着你应该这样做.如果你可以摆脱无继承设计,那么一定要做到.
我尝试过类似你描述的东西,我看到的主要问题是你不能ObjectSet<T>为派生类型创建.所以你不会有ObjectSet<Person>存储库.如果从例如BusinessObject实体派生所有实体,则只能使用ObjectSet<BusinessObject>.如果您只想查询Person存储库,您可以编写查询,Context.BusinessObjectSet.OfType<Person>().ToList()但我认为它不会生成正确的SQL,并且将首先获取完整的BusinessObject行,然后过滤掉内存中的Person实体.所以我猜它会产生巨大的性能影响.