Orm O/R映射器-好或坏

Orm O/R映射器-好或坏,orm,data-access-layer,Orm,Data Access Layer,我现在真的很纠结于使用O/R映射器还是坚持传统的数据访问。出于某种原因,每次我提到O/R映射程序时,其他开发人员都会畏缩,谈论性能问题,或者它们总体上是如何糟糕。我错过了什么?我正在研究LINQ到SQL和Microsoft实体框架。这些说法有什么根据吗?如果我想使用O/R映射器,我必须做出哪些妥协。谢谢。我看到很多OR映射器的问题是,域对象过多,通常与数据访问框架的其余部分高度耦合。我们的开发人员也对此感到畏缩:将这些对象移植到另一种数据访问技术更难。如果使用L2S,可以查看生成的代码。看起来一

我现在真的很纠结于使用O/R映射器还是坚持传统的数据访问。出于某种原因,每次我提到O/R映射程序时,其他开发人员都会畏缩,谈论性能问题,或者它们总体上是如何糟糕。我错过了什么?我正在研究LINQ到SQL和Microsoft实体框架。这些说法有什么根据吗?如果我想使用O/R映射器,我必须做出哪些妥协。谢谢。

我看到很多OR映射器的问题是,域对象过多,通常与数据访问框架的其余部分高度耦合。我们的开发人员也对此感到畏缩:将这些对象移植到另一种数据访问技术更难。如果使用L2S,可以查看生成的代码。看起来一团乱。NHibernate可能是这方面最好的之一。你的实体完全不知道你的数据访问层,如果你设计正确的话。

我第一次接触ORM映射和数据访问层是在阅读Rockford Lhotka的书《C业务对象》时。他花了数年时间为DAL的框架工作。虽然他的开箱即用的框架相当臃肿,而且在某些情况下过于夸张,但他有一些优秀的想法。我强烈推荐阅读ORM映射程序的人阅读这本书。我受到了他的书的影响,以至于我把他的很多想法都拿走了,并将它们构建到我自己的框架和代码生成中。

起初,这似乎是一个不相关的答案,但是:我的一个次要兴趣是二战时期的战斗机。战争期间,美国、英国、德国、苏联、日本等所有作战国家都制造了一批不同的战斗机。其中一些使用了径向发动机P47,海盗船,FW-190,零;一些使用直列式液冷发动机Bf-109、野马、Yak-7、Spitfire;还有一些使用了两台发动机,而不是一台P38,Do-335。有些人用机枪,有些人用大炮,有些人两者都用。如果你能想象的话,有些甚至是用胶合板做的

最后,他们都跑得非常快,在一个有能力、有经验的飞行员手中,他们会在一瞬间把你的新秀屁股射下来。我想象不出有多少飞行员在飞行时会想,哦,那个白痴在驾驶一架带有径向引擎的飞机——我根本不用担心他。每个人都明白,实现最终目标有许多不同的方法,每种方法都有其特定的优缺点,具体取决于具体情况


ORM和传统数据访问之间的争论就是这样,任何程序员都应该精通这两种方法,并选择适合手头工作的选项。

我为这个决定挣扎了很长时间。我想我之所以犹豫不决,主要有两个原因。首先,O/R映射器代表了对应用程序关键部分发生的事情缺乏控制,其次,因为我多次对解决方案感到失望,这些解决方案在90%的情况下非常棒,但在最后10%的情况下却很糟糕。当然,一切都适用于作者的select*,但当您提高复杂性,拥有一个高容量、关键的系统,并且您的职业生涯即将结束时,您会觉得需要完全控制以在线调整每个查询模式和字节。包括我在内的大多数开发人员在第一次使用该工具失败时都会感到沮丧,我们无法完成我们需要做的事情,或者我们的需求偏离了该工具支持的既定模式。我可能会因为提到工具中的特定缺陷而大发雷霆,所以我就到此为止

幸运的是,终于说服了我去尝试。不,我不为他们工作。在使用了一年多之后,我不敢相信我们没有更快地做到这一点。我的团队使用Visual Studio DB Pro,每次签入时,我们的持续集成构建都会丢失一组新的数据访问层程序集。这将自动处理所有常见的、低风险的内容,但我们仍然可以为棘手的部分编写自定义存储过程,并将它们作为方法包含在生成的类中,我们还可以为生成的代码自定义模板。我强烈推荐这种方法。可能还有其他工具也允许这种级别的控制,还有一个新的CodeSmith模板,名为PLINQO,它在后台使用LINQ到SQL。我们还没有研究过,也没有必要研究,但这种总体方法有很多优点


Jerry

这个问题没有简单的答案,因为每个ORM提供商都有自己的优缺点。一些ORM解决方案比其他解决方案更灵活。开发者有责任在使用之前理解这些

然而,以LinqToSql为例——如果您确定不需要从SQL Server切换,那么这就解决了ORM映射程序中常见的许多问题。它允许您轻松地将存储过程添加为静态方法,因此您不仅限于生成的SQL。它使用延迟 d执行,这样您就可以高效地将查询链接在一起。它使用分部类,允许您轻松地向生成的类添加自定义逻辑,而无需担心重新生成类时会发生什么。也没有什么可以阻止您使用LINQ创建自己的抽象DAL——它只是加快了过程。但最主要的是,它减轻了创建基本CRUD层所需的繁琐和时间

但也有负面影响。您的表和类之间会有一个紧密的耦合,会有轻微的性能下降,您可能偶尔会生成效率不如预期的查询。尽管其他一些ORM技术与数据库无关,但您仍然与SQL Server紧密相连


正如我所说的,在将您的颜色固定到特定的方法之前,最重要的是要了解利弊。

O/RM工具设计为在大多数情况下都能很好地执行。它将为您缓存实体,它将大量执行查询,它对对象的优化访问级别非常低,比手动为属性赋值要快得多,它们为您提供了一种非常简单的方法,使用拦截器等现代技术,将面向方面编程的各种变体结合起来,它将为您管理实体状态,并帮助解决冲突和更多问题

现在这种方法的缺点通常在于缺乏对事物如何在非常低的层次上工作的理解。最经典的问题是选择N+1

我已经在NHibernate工作了2.5年了,几乎每天都在发现一些新的东西…

很好。在大多数情况下

在大多数情况下,使用ORM的生产率优势将超过对数据访问方式失去控制


没有多少人会为了编写MSIL或汇编而避免使用C,尽管这会给他们更多的控制权

这要视情况而定

我从一家使用经过调整的ORM的公司转到一家不使用ORM的公司,一直编写SQL查询。当我问起如何使用ORM简化代码时,我的脸上一片空白,随之而来的是它的所有负面影响:

它的高膨胀 您无法很好地控制查询并执行不必要的查询 有一个沉重的对象到表的映射 这不是干代码,因为你必须重复你自己 突然

在那里工作了几个星期后,我注意到:

我们有几个几乎相同的查询,很多时候如果有bug,只有少数会得到修复 与缓存公共表查询不同,我们最终会多次读取一个表。 我们到处重复着自己的话 我们有几个级别的技能水平,所以有些查询编写得不是最有效的。 在我指出了其中的大部分之后,他们编写了一个DBO,因为他们不想将其称为ORM。他们决定从头开始写一个,而不是修改一个

而且,我觉得很多争论都来自于对ORM的无知。我所看到的每个ORM都允许自定义查询,即使遵循ORM的约定,您也可以编写非常复杂和详细的查询,并且通常更易于人类阅读。而且,它们往往非常枯燥,你给它们你的模式,它们会把其余的都弄清楚,一直到关系映射


现代ORM有很多工具可以帮助您,比如迁移脚本、访问同一对象的多个DB类型,因此您可以利用NOSQL和SQL DB的优势。但是如果你打算使用ORM,你必须为你的项目选择合适的ORM。

我喜欢那些为了“性能原因”而花费项目80%的时间来完善一个手工制作的dal,然后向最终用户吐出10万个臃肿的视图状态的开发人员……优先级这应该是社区维基吗?这个问题已经被问过多次了。只需搜索一下“ORM”,你就会找到一堆。大多数其他O/RM工具都允许映射到存储过程,同样简单。仅举几个例子:NHibernate和EntityFramework。另外,微软已经停止了对Linq2Sql的工作,所以我们基本上都在坚持当前的实现……停止对Linq2Sql的工作了吗?投票被否决,因为为正确的工作选择正确的工具对于任何编程问题来说都是如此常见和通用的答案。相反,一个更好的答案应该详细说明ORM是否合适的情况。我第二次投票反对,因为一旦考虑到细微之处,使用物理类比来描述程序架构选择总是会失败。飞行员训练时间、飞机维护成本、资源使用?@jfar:我的观点比你显然采取的方式更为笼统——那些说ORM很棒,而另一种方式完全是垃圾的人,或者说相反的人都是愚蠢的。不要说没人这么说,因为在这里人们总是这么说。至于当你考虑细节时软件分解的物理类比,我不喜欢。
我想说是的,所以我不会。DTO实际上是你的通行证。而且,是的,他们的缺点之一是他们创造的阶级爆炸。因为关键词是:生产力。我在MySQL中实现了一种具有复杂数据库的CRM系统。我无法想象每次需求发生变化时都必须手动进行所有映射。。。它发生了50次。