Subsonic ORM体验

7

我正在为一个重要项目寻找新的ORM,我习惯于使用ActiveRecord的nHibernate,并且我已经有了与EF4性能和崩溃GUI相关的非常糟糕的经验。

因此,在网上搜索后,我发现了Subsonic,我喜欢文档中所述的内容。

那么,我想知道是否有人已经使用过Subsonic,以及体验是否良好。


我喜欢Subsonic的外观,但我只使用过nHibernate,我了解它是大多数ORM的超集...并且使用其Fluent版本,我发现nHibernate非常易于使用。 - kenny
3个回答

13

嗯...好的...我该怎么说呢...

我正在努力用PetaPoco替换SubSonic。我想这说明了一些问题。

并不是说SubSonic不好,但它并不适合我的开发方式。对于现在想采用它的人来说,绝对缺乏项目活动非常重要。

首先,SubSonic不适合我的最大原因是LINQ。

确保所有属性使用都经过编译器检查确实很有吸引力。但实际上,它并不适合查询。

如果你非常严格地按照每个表一个类和ActiveRecord使用,那还可以。但只要我们需要进行任何超出此范围的查询(涉及多个表或超出最简单where子句的任何内容),就会变成一场噩梦。关联不能直接在SubSonic LINQ查询中使用,就像在EF或nHibernate中一样,这可能是最大的痛点。

例如,像这样的查询在SubSonic中无法工作,但在EF中可以:

db.Accounts.Where(a => a.OwningUser.Email != null);

我最终要么往返于数据库以组装结果,要么使用SubSonic的CodingHorror类直接查询SQL,并且无法将它们简单地实现为POCO(当超出简单的表对应类时)。我还发现每个LINQ提供程序都支持不同的操作集,并且有时相同的逻辑操作在提供程序之间的语法和使用上略有不同。这使得编写大多数查询非常耗时且容易出错。SubSonic的LINQ提供程序不缺奇怪和功能不足。与Linq-2-SQL、Entity Framework或LINQ to nHibernate相比,它在支持的操作、可用性或执行速度方面都远远不及。准备学习在LINQ中编写连接的新方法,仅用于SubSonic - 准备好让一些常见操作在SubSonic的LINQ提供程序中根本不可能,尽管已知有错误一年之久。除了影响生产力外,很容易忘记您正在编写的LINQ代码是非常特定于提供程序的。ANSI SQL比LINQ更具标准性和跨兼容性。LINQ还以重复使用代码的可能性诱惑我,例如使用规范等技术,但是完善这些技术远非易事,而且最终结果并不值得努力。我在这里遇到的障碍很大程度上是因为SubSonic的LINQ提供程序不支持关联。
SubSonic在LINQ之外的功能我认为最多只能算是平庸(个人意见)。
其次,重要的是要知道SubSonic在所有方面都不是一个活跃的项目。
SubSonic的创始人Rob Conery已经不再参与该项目。 Rob最后一次提交代码是在2010年7月尽管有近100个未解决的问题, 但该项目最近一次提交代码是在3个月前。据我所知,自从Rob停止参与SubSonic以来,甚至没有发布过小版本(虽然仍然有人继续关注该项目半年多了)。

SubSonic的谷歌小组过去很活跃,但现在不是那么活跃了。并且SubSonic项目的官方网站一段时间内一直出现黄屏问题(该网站不再出现黄屏)。

数据访问中的新热点是微ORM。实际上,SubSonic的创建者以Massive为首,StackExchange团队随后发布了Dapper,稍后推出了PetaPoco,从而引领了这一趋势。还有几个类似的工具。虽然我们在代码库中添加SQL片段会失去一些编译器检查,但我发现微ORM比SubSonic更适合我的开发风格。

我的经验(虽然有限)表明,nHibernate对于大多数情况来说过于复杂,即使在适当的情况下,它也会严重影响应用程序的启动时间。学习曲线也很高(也许你已经掌握了),而且几乎每件事情都有几种方法可以处理,这只会增加我的决策过程(减慢我的速度)。

使用PetaPoco,我可以编写熟悉的SQL语句 - 我很快也相当擅长这个 - 然后将它们转化为POCO对象,然后我可以立即知道该怎么做。再加上一些架构、组织和自动化集成测试,我就不会因为嵌入SQL代码而感到脏了。

哦,还有最后一件事 - SubSonic距离获取数据的最快方式还有很大差距。这可能不重要,但对我们来说却是关键。

总之(抱歉篇幅有点长):

并不是SubSonic在任何绝对意义上都不好。只是它似乎完全不适合我尝试使用它的方式 - 其中很大一部分原因是因为LINQ仍然是一个泄漏的抽象,并且它的泄漏方式与我所习惯的方式不同。

开发工作几乎不存在的事实既有利又有弊。好处是它很稳定,在某种程度上被认为已经“完成”了。坏处是它缺乏特性,可能存在一些错误,并且不是表现最佳 - 没有人在努力改进。


1
你的回答中有一些好的信息,但也有一些主观性。Rob并没有停止开发SubSonic。虽然它可能不是他的重点,但他在帖子和播客中已经说过这些话(当然他可以比我更好地回答这个问题)。我想第二部分是他一直说的,你可以做任何你想做的事情,因为你有源代码。我想在这方面,我们微软开发人员没有采用典型的开源哲学。另外,我不确定你使用的是哪个版本,但你总是可以使用ToList<T>并且很容易使用LINQ。 - Tim Hobbs
我很乐意承认我写的内容有些主观性,希望我的措辞能够表明这一点。看看SubSonic的公共存储库,告诉我Rob(或其他任何人)上次提交是什么时候(这是个修辞问题)。最后,说使用ToList<T>非常不切实际。非常不切实际。 - quentin-starin
+1 是为了详细说明您对 PetaPoco 的使用,PetaPoco 是除 EntityFramework 4.1 外 DAL 领域中最有趣的项目之一。我也在生产中使用 PetaPoco 应用程序。我发现 PetaPoco 的 DSL 只是所有微型 ORM 中最好的。它直截了当,不会限制您的功能,并且让您尽可能少地编写手写 SQL。 - Chris Marisic
@qes 我也同意你对nHibernate的评论。即使我花了多年的时间学习它,甚至在使用它时取得了相当高的成功率,但我发现自己再也没有使用它的欲望。我最近所有的开发都使用了Linq2Sql、PetaPoco和EF 4.1代码优先。如果我在开始退回到L2S时有PetaPoco,我可能会选择使用它。对于一个建立在Sql Server上的完整应用程序,EF 4.1代码优先确实做得很好。但是它在进行更复杂的查询/数据库优化时会遇到一些配置问题。 - Chris Marisic
我觉得@Chris Marisic回答了我的问题。我可以看出某种类型的应用程序——那些需要非常高效的查询的应用程序——会从PetaPoco这样的东西中受益。控制EF中的SQL是棘手的——不过,EF确实提供了ExecuteStoreQuery<TEntity>这样的方法,它允许你从纯SQL中加载实体。 - Adam Rackis
显示剩余7条评论

0

前段时间,我在寻找一个简单的ORM用于小型应用程序,SubSonic正是我所需要的。安装很容易,我不需要花费太多时间为我的领域类添加一些持久性。我喜欢它的地方在于,可以根据领域类自动迁移数据库模型。

缺点是,功能集相对有限。我最想要的是获取完整对象图的选项和支持额外索引的功能。SubSonic作为小型应用程序的持久性工具有其用处,但对于重要或大型应用程序,我更愿意使用nHibernate或商业ORM,如LLBLGen。

在选择ORM之前,您应该确定基本的数据访问要求。您想使用Active Record模式还是Adapter模式?并发、性能、继承等方面怎么样呢...


0

我曾经使用过Supersonic,只要你使用简单的查询,它就很好用。但是当我开始有更复杂的查询时,我发现它缺乏LINQ功能。在谷歌上搜索了一下后,我转而使用http://bltoolkit.net,从那时起(大约两年了),我非常满意。此外,它是最快的ORM之一,根据http://ormeter.net/的测试结果。看看它,你不会后悔的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接