.net ORM 比较 [关闭]

2023-12-23

我正在和某人谈论实体框架,我还不太喜欢它,但我想学习它。不过我还是很困惑到底要不要学。我听到很多人说你不应该使用实体框架,但是我没有听到任何争论。

所以我的问题是,使用实体框架的优点和缺点是什么与其他产品相比 https://stackoverflow.com/questions/1841555/what-are-some-good-entity-framework-alternatives. Like

  • NHibernate
  • 数据对象.Net
  • etc..

在易用性、可测试性、语义方面......

我知道有一些复制 https://stackoverflow.com/questions/662231/entity-framework-vs-alternatives 问题 https://stackoverflow.com/questions/3505/what-are-your-favorite-net-object-relational-mappers-orm对这个。但它们都有点过时了(2008、2009),而且说实话,论据也缺乏一些东西。我知道 Entity Framework 4.0 可用,但我还没有找到好的(完整的)比较。


Answers

这里的一些好人通过解释不同框架的一些细节来回答我的问题。我认为在这里展示它们以供将来参考可能会很好。

  • J. Tihon 发表了一篇出色的文章,解释了当您需要更多可扩展性时如何使 EF 发挥作用。 https://stackoverflow.com/questions/5101974/net-orm-comparison/5102461#5102461
  • Diego Mijelshon 针对 EF 的一些陷阱以及 NHibernate 如何解决这些陷阱创建了答案。 https://stackoverflow.com/questions/5101974/net-orm-comparison/5105917#5105917

由于 J. Tihon 在解释 EF 功能方面做得非常出色,因此我将仅列出 NHibernate 围绕 EF 运行的区域:

  • Caching
    • EF 没有现成的东西;只有一个不支持的样本 http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx
    • NH 具有完整的缓存支持,包括基于数据库的失效。它也是可扩展的并且基于提供者,这意味着它可以与不同类型的本地和分布式缓存一起使用
  • Batching
    • EF没有
    • NH 广泛支持一次延迟加载实体组或集合(在任何数据库中),并以相同的方式持久化更改(Oracle 和 SQL Server)。还有 MultiQueries 和 Future Queries,允许您任意分组不同的查询以在一次往返中发送。
  • User types
    • EF根本没有可扩展性。它甚至不支持 Enum 属性
    • NH 中没有硬编码类型映射。您可以扩展它以支持您可以创建的任何值类型、修改现有类型的映射方式等
  • Collection support
    • EF 仅支持简单的实体集合。多对多总是使用复合键
    • NH 支持实体集合、值类型、组件类型以及索引集合和字典(其中键和值都可以是任何类型)。支持具有自己密钥的多对多集合(idbag)
  • Logging
    • EF 没有开箱即用的登录功能。上面列出了相同的不受支持的示例
    • NH 具有广泛的日志记录,使您可以轻松调试问题。它默认使用 log4net,但您可以使用任何您想要的日志框架
  • Querying
    • EF 将 LINQ 作为主要查询语言。映射到关系数据库时,LINQ 具有高阻抗。 EF的提供者不支持使用实体作为参数;你总是必须使用 Id。还有一种查询语言的记录很少
    • NH 具有 LINQ(不过不如 EF 完整)、HQL、QueryOver 和 Criteria。
  • Event system and interceptors
    • EF几乎什么都没有
    • NH 拥有强大的事件系统,允许您在会话生命周期的任何点扩展或替换其行为:加载对象、持久更改、刷新等。

我认为可扩展性是主要卖点。 NH 的每个方面都与其他方面正确解耦,使用可以在需要时扩展的接口和基类,并在配置选项中公开。

EF 遵循通常的 MS 模式,默认情况下关闭事物,稍后我们将看到可扩展的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net ORM 比较 [关闭] 的相关文章

  • int -> int list 与类型 int -> IEnumerable<'a> 不兼容

    Given open System Linq 这是一个可以接受的表达方式 2 3 4 SelectMany fun n gt 1 n 但这不是 2 3 4 SelectMany fun n gt 1 n 错误消息显示 int gt int
  • WPF 元素宿主内存泄漏

    我在 Windows 窗体上使用元素主机时遇到奇怪的内存泄漏 我有一个主窗体 它打开另一个窗体 该窗体上只有 elementhost 控件 此时 它没有 wpf 控件子控件 只能打开 1 个主机表单 每次我打开窗体时 应用程序内存都会增加2
  • 服务层设计。将事物放入服务层的原因

    我有一些与设计相关的问题 should service layer interfaces居住在一个domain layer 例如user service 将代码部分移动到单独层的主要原因是什么 should service layer居住在
  • 为什么自定义类型变量不保存值MVC

    我正在尝试使用 MVC 5 构建一个网站 我有一个包含 3 个变量的控制器类 public class WorkerController Controller public ViewModel viewModel new ViewModel
  • 字典 API(词汇)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道一个好的 NET 字典 API 吗 我对含义不感兴趣 而是我需要能够以多种不同的方式查询单词 返
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • Java有没有类似微软CHESS的工具?

    是否有类似于 Microsoft 的现有 Java 工具CHESS http research microsoft com chess 或者 CHESS 源代码是否开放 以便我可以尝试将其转换为 Java 谷歌的织线工 http code
  • 如何让 LinqToSql 将“索引提示”传递给 sql server?

    由于我们不能相信我们的客户会更新 sql server 中的索引统计信息等 因此我们过去不得不使用索引提示 http www sql server performance com tips hints general p1 aspx 由于我
  • 在 Objective-C 中比较 2 个字符串

    我写了以下代码 if depSelectedIndice gt 1 comSelectedIndice gt 1 NSLog depart elemet d depSelectedIndice NSLog depart elemet d c
  • C# - 方法必须有返回类型

    我在调用 C 中的方法时遇到问题 不断收到消息 方法 计算 必须有返回类型 using System Diagnostics namespace WindowsFormsApplication1 public partial class F
  • “你好世界!!”在 .NET 4 中生成 3500 个页面错误

    我正在运行 Windows Vista 和 Visual Studio 2010 使用 NET 4 2 GB RAM 和大约 800 MB 可用空间 我创建了一个 Windows 窗体应用程序 但没有向其中添加任何代码 只需在发布模式下编译
  • 为什么当要求修剪“PRN.NUL”时,TrimStart 会更多地修剪字符?

    这是代码 namespace TrimTest class Program static void Main string args string ToTrim PRN NUL Console WriteLine ToTrim string
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 枚举扩展方法

    在vs2008中 是否可以编写适用于任何枚举的扩展方法 我知道您可以针对特定枚举编写扩展方法 但我希望能够使用单个扩展方法对每个枚举进行处理 这可能吗 是的 只需针对基础进行编码Enum类型 例如 public static void So
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • VB.NET 中的静态方法实现

    我很困惑Static在 VB NET 中的实现 在 C 中 我们可以创建静态类和静态方法来为我们的应用程序编写实用方法 现在 VB NET 让我们创建Module代替静态类 如果我们在模块中创建一个方法 默认情况下它会变成静态的 但在我的应
  • 引用的程序集自动由 Visual Studio 替换

    我有 2 个项目 一个可移植类库和一个常规单元测试项目 在可移植类库中 我使用 NuGet 来引用 Microsoft BCL 可移植包 它附带 2 个程序集 System Threading Tasks dll and System Ru
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码

随机推荐