【发布时间】:2012-06-12 19:01:30
【问题描述】:
我正在尝试主要在这方面决定 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 与专有论点。团队没有时间去窥探底层代码并开始弄乱其他人的代码。我更关心“它只是工作”的角度。
【问题讨论】:
-
写得很好的问题,虽然我担心这对 SO 来说有点开放;这里的问题通常/经常有一些源代码,并且应该导致清晰,实用的答案。也许它更适合 Programmers.SE?
标签: .net entity-framework nhibernate orm fluent-nhibernate