2

我目前正在开发具有 Oracle 数据库后端的 ASP.NET MVC 应用程序的新版本。当我开始开发时,我惊讶地发现它只是使用 ADO.NET 命令连接到 Oracle。在与另一位开发人员交谈后,我发现他们去年尝试切换到实体框架,但该框架存在许多性能问题,他们不想再次重复这些问题。

我正在尝试找出其他选择:

  1. 继续使用 ADO.NET 并构建一个封装数据库调用的包装类。基本上是企业库 DAAB 的自定义轻量版。
  2. 使用企业库 DAAB
  3. 使用 NHibernate
  4. 实体框架(由于性能问题,不能选择)

每种方法都有缺点。由于 Microsoft 的 OracleClient 提供程序在 .NET Framework 4.0 版中已被弃用,因此只有使用 Oracle 的 ODP.NET 提供程序才有意义。这是 Enterprise Library 的一个问题,因为当前版本 (6.0) 仍然使用 Microsoft 的 OracleClient。看起来有人已经将 OracleClient 换成对 ODP.NET 的引用,但它似乎不是一个大群体,所以我担心如果我们运行会遇到问题并且资源很少成问题。

NHibernate 使用 ODP.NET,但开发速度已经放缓,他们仍然没有发布基于 .NET 4.0 的更新版本,即使它已经发布了 3 年。开始新的 NHibernate 工作似乎并不明智。

创建一个包装类将允许我们使用 ODP.NET,但这是一项大量工作。如果存在更好的解决方案,我讨厌花时间重新创建轮子。

目前,这让我们只需为 ADO.NET 创建一个轻量级包装器。2013 年末还有其他有效的选择吗?我需要一个由公司支持或拥有活跃社区的选项,这样我们在遇到问题时就不会独自飞行。

更新 使用来自 Enterprise Library Contrib 项目的 Oracle ODP.NET Data Provider v6.0 查看 Enterprise Library DAAB。有人有这个选项的经验吗?

4

4 回答 4

3

我仍在 .NET 4.5 上使用 NHibernate 3.1。它工作得很好。我的项目已经增长到 300kloc,在管理 NHibernate 方面没有任何问题。除非您需要 NHibernate 在 .NET 4.5 下无法执行的操作,否则我认为 NHibernate 没有问题。

但是,由于 NHibernate 很复杂,因此团队中最好有人具有 NHibernate/Hibernate 经验。他将在使用 NHibernate 方面帮助其他人很多。

于 2013-10-29T14:12:36.897 回答
1

我目前从事一个项目,该项目通过DotConnect for Oracle将 Entity Framework 与 Oracle 11g 结合使用。

与 Visual Studio 集成,以及一个名为Entity Developer的独立 ORM 工具,我们使用它在对数据库进行更改时构建和重新构建模型。

于 2013-10-29T14:26:56.503 回答
0

我已经在 Oracle 和 SQL Server 上使用 NHibernate 有一段时间了。每当您使用对象图/树拥有更复杂的数据结构时,您可能很快就会遇到臭名昭著的 N+1 问题,这可能会给您带来实体框架的性能问题。想象一下通常的博客/博客条目/评论示例:加载 20 个博客,每个博客有 20 个博客条目,每个条目有 10 条评论,将导致 1(+1)对博客的选择查询,20(N)对条目和 200查询所有评论(下一级),无需进一步优化。基本的选择是在“延迟加载”和 N+1 之间,或者一个相当大的连接(每个博客行在这里出现 200 次)。这对于三个级别可能很难,但对于 7 个级别绝对不行!

NHibernate 有一些很好的方法来解决这个问题,例如集合批处理,它为 10、20、50 或多少个你想要的父母获取子对象。据我所知,EF 只有 N+1 延迟加载与 Join 的选择(如果我错了,请纠正我!),大多数自制或轻量级映射器可能有同样的问题。这只是从规范化关系模式加载对象数据的问题。

通过 ORM 将关系数据映射到对象并返回与其说是工作和性能问题,不如说是数据库访问,以及不充分/错误的实现。

此外,NHibernate 有很好的机会重用已经存在于数据库中的查询计划(大多数 DBMS 通过 SQL 字符串相等性检查这一点),从而避免为每个查询进行昂贵的重新计算。我认为它是目前可用的最成熟的 ORM,而 EF 已经并将在一段时间内远远落后(他们首先关注易用性)。

当使用 NHibernate 和 Oracle 时,使用 ODP.NET 驱动程序;旧的微软驱动程序仍然可以使用,但有严重的缺点,破坏了前面提到的一些功能!

然而,NHibernate 很难理解和实现。我花了很长时间才明白有多少映射真正起作用。不了解工作单元模式、不了解持久性(不使用“保存”显式插入/更新数据库)、避免复杂的关系映射和其他困难经常导致错误实现和性能不佳。只需搜索“NHibernate 反模式”即可了解其中一些陷阱!另外,我也担心它可能很快就会被放弃。也许是由于最近的“NoSQL”炒作,或者是因为没有人想与实体框架竞争。

但是,如果您不需要经典的 OLTP 样式数据库,不需要复杂的事务、连接和 ACID,那么文档数据库(“NoSQL”)可能是首选工具。如果你这样做了,NHibernate 似乎仍然是最好的,如果性能很重要的话。

于 2013-10-30T00:30:06.033 回答
0

可能这对你来说会很有趣

http://www.oracle.com/technetwork/issue-archive/2011/11-sep/o51odt-453447.html

我正是使用这种方式(ODP for .Net with VS tools )并且它工作正常。

于 2013-10-29T14:01:50.543 回答