2013年末使用Oracle数据库的.NET应用程序有哪些数据访问选项?

时间:2013-10-29 13:51:55

标签: c# asp.net .net oracle nhibernate

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

我正在试图弄清楚其他选择:

  1. 继续使用ADO.NET并构建一个包装类来封装数据库调用。基本上是企业库DAAB的自定义轻型版本。
  2. 使用Enterprise Library DAAB
  3. 使用NHibernate
  4. 实体框架(由于性能问题而不是选项)
  5. 每种方法都有缺点。由于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 Project中的Oracle ODP.NET Data Provider v6.0查看企业库DAAB。有没有这方面的经验?

4 个答案:

答案 0 :(得分:3)

我仍然在.NET 4.5上使用NHibernate 3.1。它很棒。我的项目已经增长到300kloc而没有任何管理NHibernate的问题。除非你需要NHibernate在.NET 4.5下无法做到的事情,否则我认为NHibernate没有问题。

然而,由于NHibernate很复杂,所以团队中最好有NHibernate / Hibernate经验。他将使用NHibernate帮助其他人。

答案 1 :(得分:1)

我目前正致力于通过DotConnect for Oracle将实体框架与Oracle 11g结合使用的项目。

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

答案 2 :(得分:0)

可能这对你很有意思

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

我正是以这种方式使用(带有VS工具的.Net的ODP),它的工作正常。

答案 3 :(得分:0)

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

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

通过ORM和关系数据将关系数据映射到对象不是工作和性能问题,而是数据库访问,结合不充分/错误的实现。

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

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

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

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