我试图主要在这个领域决定 2 ORM 的优缺点。
- 与 Sql Server 2008 R2 和 2012 的兼容性。
- 这非常重要,因为我们根本没有资源来调试对现有 MS 技术堆栈的不良支持。
- 自 2012 年以来的提前计划也几乎已经结束,并且迁移到它的计划已经到位。
- 支持 .NET 4.0 和 4.5(即将推出)
- 出于与上述几乎相同的原因,再次非常重要。
- 事务处理和表提示,例如。forcescan forceeek,读取未提交。
- 很多时候查询优化器做得很好,其他时候我希望灵活地告诉它该做什么。
- 支持对话、自我跟踪附加和分离
- 这有点基本。我讨厌长时间保持会话开放。特别是在分布式计算/网络农场环境中。
- 能够在不破坏数据的情况下处理代码优先开发、创建和更新模式。
- EF 4.1 似乎在这方面有所欠缺,尽管 4.3 的跳跃性更好。也比 NH 中的单独映射类更喜欢数据注释。原因是我希望能够在类中发送,并从那里能够创建持久性模型而不扩大映射类的方法。
- 支持 IRepository 模式
- 支持 LINQ
- 与上面的 (6) 有点相关,我希望对 linq 有很好的支持。我不希望开发人员在较低级别的实现中胡闹,并让自己陷入一种特定的 ORM
- 表现
- 支持批量 CRUD 操作,无需将数据加载到应用层。例如。我想将特定表的列中的所有行增加 1。我不想将其加载到内存中,并逐行递增。对于如此简单的操作,这将是疯狂的。Linq2Sql 以前有 Magiq 来处理这种事情,NH 和 EF 有什么?
- 缓存、急切加载、延迟加载、导航属性。
- 坦率地说,我讨厌这些事情隐含地完成。原因是很难区分缓存的内容、陈旧的内容和新的内容。在 EF 中,我通常会删除所有导航属性,因为我不希望这些属性与前 5 个一起加载,因为这是当前操作需要的,但是在流的更下游,另一个开发人员尝试进行不准确的计数。
- 所以我的个人政策——除非有充分的理由,否则所有 SOA 都应该是无状态的。如果您需要引用数据,请从持久性中获取。它会更慢,但代码将更具可读性和灵活性。
- 缓存也是如此。它在分布式环境中足够复杂,我希望所有缓存都非常明确。如果开发人员想要针对缓存编写代码,则应该这样做,而不是针对 ORM 编写代码,并使其看起来好像他正在从持久性中提取新数据,而实际上他正在获取陈旧数据。
- 现在的问题是,NHibernate 是否有任何概念/抽象可以使缓存、急切/延迟加载比 EF 中当前可用的更明确。在这种情况下,我不太关心易于开发,我更关心清晰度和明确性。
此外,我不太关心 OSS 与专有论点。团队没有时间去窥探底层代码并开始弄乱其他人的代码。我更关心“它只是工作”的角度,而不是其他任何事情。