我正在和某人谈论实体框架,我还不太喜欢它,但我想学习它。不过我还是很困惑到底要不要学。我听到很多人说你不应该使用实体框架,但是我没有听到任何争论。
所以我的问题是,使用实体框架的优点和缺点是什么与其他产品相比 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(使用前将#替换为@)