2011-08-04 37 views
6

我有一个Web应用程序具有:并发用户实体框架 - 适用于企业级应用程序吗?

  • 1 TB的DB
  • 200+表
  • 至少有50桌有超过100万的记录每一个
  • 10+开发商

该项目目前使用Ad-Hoc Sql,它是由自定义ORM解决方案生成的。 而不是支持自定义ORM(这是缺少很多高级功能),我想切换到实体框架。

我在一个较小的项目上使用了EF 4.1(Code-First),它工作得很好,但是它对上面的一个更大的项目是可缩放的吗?

回答

8

我(高度)同意marvelTracker(和Ayende的)想法。

下面是一些更多的信息,但:

战略重点

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

枚举

的EntityFramework不支持原生枚举。直到这增加了对枚举http://blogs.msdn.com/b/adonet/archive/2011/06/30/walkthrough-enums-june-ctp.aspx支持使用替代方法请看映射枚举的唯一途径六月CTP:How to work with Enums in Entity Framework?

查询:

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

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

的Isession的QueryOver:

// Query that depends on a session: 
premises = session.QueryOver<Premise>().List(); 

独立式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. 

开源

NHibernate的有一个可用的很多贡献项目在http://sourceforge.net/projects/nhcontrib/

这个项目提供了一些非常有用的扩展NHibernate的(其他中):

  • 缓存提供商(对于2级高速缓存)
  • 依赖注入实体没有默认构造函数
  • 全文搜索(Lucene.NET集成)
  • 空间支持(NetTopologySuite集成)

支持

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

而且,看看: http://www.infoq.com/news/2010/01/Comparing-NHibernate-EF-4

2

适合是一个有趣的术语。它可用吗?是的,你会发现许多非常适合快速应用程序开发的功能。也就是说,它是一种半熟的技术,并且缺少自己的前任LINQ to SQL(甚至是第一次发布3年后)的许多高级功能。这里有一些烦恼:

  • 可怜的复杂LINQ支持
  • 没有枚举属性类型
  • 缺少SQL转换(解析日期时间,解析INT等)(尽管你可以通过模型中定义的函数实现这些)
  • 劣质的SQL可读性
  • 问题保持多个SSDL/CSDL/MSL资源独立的分片(不是真的有代码首先一个问题)与运行中的迪菲多个并发事务
  • 问题租的ObjectContext的
  • 问题与独立实体场景

这就是说,微软已经投入了大量的精力它,希望它会继续改善随着时间的推移。我个人会花时间实现一个抽象的Repository/Unit of Work模式,因此你的代码根本不知道它使用EF,如果有必要,你可以在将来转换到另一个LINQ to DB提供者。

大多数现代化的ORM将从ad-hoc SQL中走出来。

相关问题