NHibernate 强大而强大,但您不必了解它的所有内容才能成功使用它。要回答您的问题:
我所知道的所有 .NET micro-ORMS 都没有任何 LINQ 支持,而是依赖于在代码中混合 SQL 字符串。使用 LINQ 构建查询可为您提供类型安全、编译时检查和出色的可重构性。如果所有查询都使用 SQL 字符串,请尝试重构包含数千个查询的代码库……哎呀!通过重构,我的意思是添加新列、新表等简单的事情,这在企业环境中一直在发生。重构字符串是可能的,这就是依赖存储过程的人们仍然需要做的事情,但如果我可以使用类型安全,我肯定不会选择这样做。
对于延迟加载,您唯一需要记住的是创建一个 SELECT N+1 场景。任何时候你有代码在域对象/实体上执行 foreach 循环,确保填充对象的查询使用了 .Fetch() 方法,该方法只是在 SQL 中创建一个 JOIN 并填充任何子对象。否则,当您遍历对象并点到任何子对象时,ORM 将不得不执行另一个 SELECT 语句来“获取”数据。基本上,在 NHibernate 术语中,Eager fetching 是您的朋友。
使用 NHibernate 进行批处理就像馅饼一样简单。在您的 NHibernate 配置中,打开批处理就可以了。之后,如果您确实需要,您可以在运行时为特定查询调整批处理大小。
我自己从来没有使用过二级缓存。我在大型企业环境中工作,我们的应用程序运行速度非常快,无需缓存。NHibernate 中的一级缓存虽然不需要配置,但可以简单地认为是更改跟踪。基本上,NHibernate 在内部保留了一个字典,其中包含它已经从数据库中检索到的对象以及哪些对象等待在数据库中保存/更新。一级缓存是我从来没有真正考虑过的,但我想在初级水平上了解它是如何工作的很好。
同样,我目前在企业环境中工作,我们有各种使用 NHibernate 的应用程序;一些非常基本,而另一些则使用 NHibernate 必须提供的所有强大功能。不过,根据我的经验,我通常看到的是,并非团队中的每个成员都需要成为 NHibernate 专家。通常 1 到 3 名开发人员知识渊博,其他所有人都不会担心,只需创建他们的实体、映射并继续他们的编程。一旦基础设施到位并且您的组织已经整理出它希望使用的模式,一切通常都是轻而易举的。
额外的想法:
NHibernate 真正闪耀的一个地方是它能够映射任何一种你扔给它的疯狂数据库设计。现在我并不是说在 90 年代初期将一些疯狂的数据库设计映射在一起很容易,您必须将存储过程和另一个表连接在一起,但这是可能的。我一天中做过一些疯狂的映射。有些我什至认为是不可能的,因为数据库的设计目的并不是我们想要它做的事情,但是每次,通过持久性,我仍然设法利用 NHibernate 在映射好的和坏的数据库设计方面令人难以置信的灵活性来完成它。
使用 Micro-ORMS,您通常会在代码旁边嵌入大量 SQL 字符串。这如何被认为是清洁和高效的。似乎所有人现在都在将他们用来放入存储过程的东西放入他们的代码中。实际上,我确实在我的一些项目中使用了 Micro-ORM,尽管它是有意义的,但通常是当我只在一个表上查询一些简单的数据时——没有复杂的 WHERE 子句。
公平地说,我是那些投入大量时间学习 NHibernate 细节的人之一,但不是因为我需要工作,而是因为我只是想这样做。我和很多人一起工作,他们每天都在使用 NHibernate,但并没有完全理解它。但同样,他们不需要。你只需要知道一些基本的东西就可以了。
希望这可以帮助。