我一直在研究一些不同的 .NET 产品,它们建议通过为业务对象提供一种无缝映射到自动生成的数据库的方法来加快开发时间。我在编写数据访问层时从来没有遇到过问题,但我想知道这种类型的产品是否真的能节省它声称的时间。我还担心我会放弃对数据库的过多控制,从而使追踪任何数据级问题变得更加困难。在数据库和业务对象结构必须改变的情况下,这些类型的产品会变得更好还是更糟?
本质上,值得吗?我会节省“那么多”时间、精力和未来的错误吗?
我一直在研究一些不同的 .NET 产品,它们建议通过为业务对象提供一种无缝映射到自动生成的数据库的方法来加快开发时间。我在编写数据访问层时从来没有遇到过问题,但我想知道这种类型的产品是否真的能节省它声称的时间。我还担心我会放弃对数据库的过多控制,从而使追踪任何数据级问题变得更加困难。在数据库和业务对象结构必须改变的情况下,这些类型的产品会变得更好还是更糟?
本质上,值得吗?我会节省“那么多”时间、精力和未来的错误吗?
我使用过 SubSonic 和 EntitySpaces。一旦你掌握了它们的窍门,我相信它们可以节省你的时间,但是随着你的应用程序的复杂性和数据量的增长,你可能会超过这些工具。您开始浪费时间试图弄清楚诸如性能问题是否与 ORM 或您的代码有关。所以,要回答你的问题,我认为这取决于。我倾向于同意 Eric 的观点,大容量企业应用程序不是通用 ORM 的好地方,但在标准票价的小型 CRUD 类型应用程序中,您可能会看到一些节省的时间。
我发现来自 Apache 小组的iBatis是解决这个问题的绝佳方案。我的团队目前正在使用 iBatis 将我们所有的调用从 Java 映射到我们的 MySQL 后端。这是一个巨大的好处,因为它很容易管理我们所有的 SQL 查询和过程,因为它们都位于 XML 文件中,而不是我们的代码中。无论是什么语言,将 SQL 与您的代码分开都会有很大的帮助。
此外,iBatis 允许您编写自己的数据映射器来将数据映射到您的对象和从您的对象到 DB。我们想要这种灵活性,而不是为您做所有事情的 Hibernate 类型的解决方案,而且 (IMO) 限制了您执行复杂查询的能力。
iBatis 也有一个 .NET 版本。
我最近从 Castle Project 为一个应用程序设置了ActiveRecord 。这很容易上手。在用它创建了一个新应用程序之后,我什至使用 MyGeneration 为 ActiveRecord 可以在很短的时间内使用的旧应用程序编写类文件。它使用 NHibernate 与数据库交互,但带走了 NHibernate 附带的所有 xml 映射。好消息是,如果有必要,您的项目中已经有 NHibernate,如果您有一些特殊情况,您可以使用它的全部功能。我建议看看它。
ORM 有很多选择。Linq 到 Sql,nHibernate。对于纯对象数据库,有 db4o。
这取决于应用程序,但对于大容量企业应用程序,我不会走这条路。您需要对数据进行更多控制。
周末我和一位朋友讨论过这个问题,如果您需要能够在应用程序之外查询数据库,您在易于存储方面所获得的收益似乎会丢失。我的理解是,这些数据库通过以非规范化方式存储您的对象数据来工作。这样可以快速检索整组对象,但如果您需要从与您的对象模型不匹配的角度选择数据,则 odbms 可能很难获取您想要的特定数据。