我正在为一个重要项目寻找新的ORM,我习惯于使用ActiveRecord的nHibernate,并且我已经有了与EF4性能和崩溃GUI相关的非常糟糕的经验。
因此,在网上搜索后,我发现了Subsonic,我喜欢文档中所述的内容。
那么,我想知道是否有人已经使用过Subsonic,以及体验是否良好。
嗯...好的...我该怎么说呢...
我正在努力用PetaPoco替换SubSonic。我想这说明了一些问题。
并不是说SubSonic不好,但它并不适合我的开发方式。对于现在想采用它的人来说,绝对缺乏项目活动非常重要。
首先,SubSonic不适合我的最大原因是LINQ。
确保所有属性使用都经过编译器检查确实很有吸引力。但实际上,它并不适合查询。
如果你非常严格地按照每个表一个类和ActiveRecord使用,那还可以。但只要我们需要进行任何超出此范围的查询(涉及多个表或超出最简单where子句的任何内容),就会变成一场噩梦。关联不能直接在SubSonic LINQ查询中使用,就像在EF或nHibernate中一样,这可能是最大的痛点。
例如,像这样的查询在SubSonic中无法工作,但在EF中可以:
db.Accounts.Where(a => a.OwningUser.Email != null);
SubSonic的谷歌小组过去很活跃,但现在不是那么活跃了。并且SubSonic项目的官方网站一段时间内一直出现黄屏问题(该网站不再出现黄屏)。
数据访问中的新热点是微ORM。实际上,SubSonic的创建者以Massive为首,StackExchange团队随后发布了Dapper,稍后推出了PetaPoco,从而引领了这一趋势。还有几个类似的工具。虽然我们在代码库中添加SQL片段会失去一些编译器检查,但我发现微ORM比SubSonic更适合我的开发风格。
我的经验(虽然有限)表明,nHibernate对于大多数情况来说过于复杂,即使在适当的情况下,它也会严重影响应用程序的启动时间。学习曲线也很高(也许你已经掌握了),而且几乎每件事情都有几种方法可以处理,这只会增加我的决策过程(减慢我的速度)。
使用PetaPoco,我可以编写熟悉的SQL语句 - 我很快也相当擅长这个 - 然后将它们转化为POCO对象,然后我可以立即知道该怎么做。再加上一些架构、组织和自动化集成测试,我就不会因为嵌入SQL代码而感到脏了。哦,还有最后一件事 - SubSonic距离获取数据的最快方式还有很大差距。这可能不重要,但对我们来说却是关键。
总之(抱歉篇幅有点长):
并不是SubSonic在任何绝对意义上都不好。只是它似乎完全不适合我尝试使用它的方式 - 其中很大一部分原因是因为LINQ仍然是一个泄漏的抽象,并且它的泄漏方式与我所习惯的方式不同。
开发工作几乎不存在的事实既有利又有弊。好处是它很稳定,在某种程度上被认为已经“完成”了。坏处是它缺乏特性,可能存在一些错误,并且不是表现最佳 - 没有人在努力改进。
ExecuteStoreQuery<TEntity>
这样的方法,它允许你从纯SQL中加载实体。 - Adam Rackis前段时间,我在寻找一个简单的ORM用于小型应用程序,SubSonic正是我所需要的。安装很容易,我不需要花费太多时间为我的领域类添加一些持久性。我喜欢它的地方在于,可以根据领域类自动迁移数据库模型。
缺点是,功能集相对有限。我最想要的是获取完整对象图的选项和支持额外索引的功能。SubSonic作为小型应用程序的持久性工具有其用处,但对于重要或大型应用程序,我更愿意使用nHibernate或商业ORM,如LLBLGen。
在选择ORM之前,您应该确定基本的数据访问要求。您想使用Active Record模式还是Adapter模式?并发、性能、继承等方面怎么样呢...
我曾经使用过Supersonic,只要你使用简单的查询,它就很好用。但是当我开始有更复杂的查询时,我发现它缺乏LINQ功能。在谷歌上搜索了一下后,我转而使用http://bltoolkit.net
,从那时起(大约两年了),我非常满意。此外,它是最快的ORM之一,根据http://ormeter.net/
的测试结果。看看它,你不会后悔的。