5

我试图主要在这个领域决定 2 ORM 的优缺点。

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

此外,我不太关心 OSS 与专有论点。团队没有时间去窥探底层代码并开始弄乱其他人的代码。我更关心“它只是工作”的角度,而不是其他任何事情。

4

5 回答 5

10

虽然我在另一个问题中写过其中一些问题,但我认为值得逐点回答。

  1. 两者都与所有 SQL Server 版本兼容
  2. 两者都与 .NET 4.x 兼容。NH 的目标仍然是 3.5,这不是问题。
  3. 两者都有事务处理。两者都不支持本地查询语言中的查询提示,但都允许您使用 SQL。
  4. 两者都允许您重新连接断开的实体。我个人认为这不是一个好习惯(我更喜欢传递 DTO)
  5. 架构迁移在 EF 中更加成熟和灵活。映射在新罕布什尔州更好。它确实支持使用属性进行映射,这比 EF 的等效功能强大得多,您很快就会发现它甚至不支持基本的东西(例如指定小数字段的精度)
  6. 您可以在任何一个之上实现您的存储库。
  7. 两者都支持 LINQ。EF 支持更广泛的查询,但有时会产生效率极低的查询。你不应该降低你的开发实践;每种查询方法都有其优点,优秀的开发人员应该知道这些选项。
  8. NH 的性能通常更好,因为它具有映射灵活性以及对批处理、缓存和 DML 语句的支持
  9. EF 不支持批量 (DML) 操作。NH 确实,使用与 SQL 非常相似的 INSERT/UPDATE/DELETE 语句,但在对象模型上(例如,您可以使用点语法而不是显式连接来指定条件)
    • EF 不支持缓存,句号。有一些不受支持的样品尚未准备好投入生产。NHibernate 中的所有缓存都是显式的(您指定要缓存的实体、集合和查询,多长时间等)。它支持像 memcached 这样的分布式缓存,因此它也可以处理过时的缓存数据。
    • 两者都允许您显式地预先加载引用和集合。在我看来,NH 有一个更好的代理设计,它不会用 FK 污染你的模型(这是一个很长的话题,如果你愿意,你可以发布一个后续问题)。和往常一样,在指定必须如何加载每个关系时,您确实具有更大的灵活性。

简而言之:NH 更灵活,性能更好,毫无疑问。EF 具有更好的迁移支持、更简单的学习曲线和更完整的 LINQ 提供程序。

于 2012-06-12T21:24:18.350 回答
8

首先,我在各个方面都比较喜欢NHibernate。Entity Framework 在 5.0 版中也遗漏了一些东西。

  1. 在 NHibernate 中添加新类型非常容易,因此如果 SQL Server 2012 有新类型,您可以实现相关方言/提供程序,但社区始终在工作
  2. 我知道 NH 团队正在努力支持 FW 4.5,EF从 5.0 开始支持它
  3. 使用 NH,您可以为所欲为
  4. NH 支持 Merge 方法重新附加实体,EF 也
  5. EF 不支持命名约定,NH 支持,我也在写一个基于 DataAnnotations 的自动映射器,这里是旧版本的链接,等待 2 周的新版本
  6. 使用 NH 或 EF,您可以使用存储库和工作单元模式实现数据层,我还必须在 NuGet 上发布这个包
  7. EF 完全支持 LINQ,NH 不支持,但您可以使用扩展点进行修补
  8. 我觉得性能是同级别的,NH更好地支持二级缓存所以容易防止对数据库的命中
  9. NH 有改进的批处理支持,我不知道 EF(特别是 5.0)
  10. NH 对扩展点有更好的实现,因此代理/缓存/日志记录比 EF 强大,但是在 EF 中你可以编写一个包装器来获得你需要的东西

最后,使用 NH 更容易实现 DDD 模式,因为映射更灵活。

于 2012-06-12T19:37:25.180 回答
6

你可以使用 bltoolkit ;) -> http://www.bltoolkit.net/Doc.Linq.ashx

只需花 2 分钟时间阅读此内容 -> http://www.bltoolkit.net/Doc.LinqModel.ashx

但简而言之

  • 非常好的 Linq 支持
  • DML 操作 (nr 9)
  • 出色的性能/批量支持
  • 生成的很棒的 Sql
  • 枚举支持;-)
  • 没有延迟加载/实体跟踪/特殊的魔法缓存,你现在这些通常会导致问题的东西
  • 没有神奇的特性 -> 更少的抽象 -> 更少的泄漏 -> 更少的麻烦 -> 更小的学习曲线

顺便说一句,它确实是 nr 3,它具有属性 TableFunction 和 TableExpression 以支持表值 UDF、提示和其他围绕表装饰。因此,您可以编写自己的扩展方法以在您的 Linq 语句中使用,例如

[TableExpression("{0} {1} WITH (TABLOCK)")]
public Table<T> WithTabLock<T>()
    where T : class 
{
    return _ctx.GetTable<T>(this, ((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(T)));
}

接着

using (var db = new TestDbManager())
{
    var q =
        from p in new Model.Functions(db).WithTabLock<Parent>()
        select p;

    q.ToList();
}

示例 DML 操作

  db.Employee
    .Where(e => e.Title == "Spectre")
    .Set(e => e.Title, "Commander")
    .Update();
于 2012-06-13T13:32:02.450 回答
1

你不想要他们中的任何一个。您将无法指定任意表格提示,并且它不会像您希望的那样灵活。

如果所有这些都是要求,那么地球上没有 ORM 可以满足这些要求。

编辑:

根据您的评论。nHibernate 将为您提供最强大的功能,但代价是设置模型的复杂性增加。有一些工具可能会有所帮助,但每个工具都有其优点和缺点。

EF 更易于配置和使用,但功能较弱。nHibernate 正好相反。您必须在功能和复杂性之间做出选择。

顺便说一句,关于批量操作和其他操作,您可以直接从框架中为此类操作发出 SQL。或调用存储过程。

于 2012-06-12T19:09:03.367 回答
1

只是为了添加其他答案......

几天前,Ricardo Peres写了一篇非常好的、公正的 NHibernate 和 Entity Framework 比较。它可能对您的研究有所帮助。

你可以在这里找到它:http ://weblogs.asp.net/ricardoperes/archive/2012/06/07/differences-between-nhibernate-and-entity-framework.aspx

于 2012-06-12T20:38:04.787 回答