实体框架 - 它适用于企业级应用程序吗?

Eri*_*c P 8 entity-framework entity-framework-4.1

我有一个Web应用程序:

  • 1太字节数据库
  • 200多张桌子
  • 至少50个表,每个表有100多万条记录
  • 10多名开发人员
  • 1000个并发用户

该项目目前正在使用Ad-Hoc Sql,它是由自定义ORM解决方案生成的.我不打算支持自定义ORM(缺少很多高级功能),而是考虑切换到Entity Framework.

我在一个较小的项目上使用了EF 4.1(Code-First)并且它工作得很好,但它是否可以扩展到上面一个更大的项目?

Nik*_*nis 9

我(非常)同意marvelTracker(和Ayende的)的想法.

以下是一些进一步的信息:

关键战略

将GUID用作主键时,存在众所周知的成本.它由Jimmy Nilsson描述,并已在http://www.informit.com/articles/article.aspx?p=25862公开发布.NHibernate支持GUIDCOMB主键策略.但是,要在EntityFramework中实现这一点有点棘手,需要额外的步骤.

枚举

EntityFramework本身不支持枚举.直到六月CTP增加对Enums的支持http://blogs.msdn.com/b/adonet/archive/2011/06/30/walkthrough-enums-june-ctp.aspx映射枚举的唯一方法是使用变通方法请查看at:如何使用实体框架中的枚举?

查询:

NHibernate提供了许多查询数据的方法:

  • LINQ(使用re-motion的re-linq提供商,https: //www.re-motion.org/web/ )
  • 命名查询封装在查询对象中
  • ICriteria/QueryOver用于预先不知道标准的查询
  • 使用QueryOver投影和聚合(在某些情况下,我们只需要实体的特定属性.在其他情况下,我们可能需要聚合函数的结果,例如平均值或计数):
  • PagedQueries:为了避免压倒用户并提高应用程序响应能力,大型结果集通常会分解为较小的结果页面.
  • MultiQueries将多个ICriteria和QueryOver查询组合到一个数据库往返中
  • 分离的查询,它是应用程序部分中的查询对象,无需访问NHibernate会话.然后使用会话在其他地方执行这些对象.这很好,因为我们可以使用许多方法来避免复杂的存储库.

ISession的QueryOver:

// Query that depends on a session:
premises = session.QueryOver<Premise>().List();
Run Code Online (Sandbox Code Playgroud)

分离的QueryOver:

// Full reusable query!
var query = QueryOver.Of<Premise>();

// Then later, in some other part of ther application:
premises = query.GetExecutableQueryOver(session).List(); // Could pass IStateleSession too.
Run Code Online (Sandbox Code Playgroud)

开源

NHibernate在http://sourceforge.net/projects/nhcontrib/上提供了很多贡献项目.

这个项目为NHibernate(以及其他)提供了许多非常有用的扩展:

  • 缓存提供程序(用于二级缓存)
  • 没有默认构造函数的实体的依赖注入
  • 全文搜索(Lucene.NET集成)
  • 空间支持(NetTopologySuite集成)

支持

EntityFramework附带Microsoft支持.NHibernate有一个活跃的社区:

另外,请查看:http: //www.infoq.com/news/2010/01/Comparing-NHibernate-EF-4