Entity framework 实体框架-是否适合企业级应用程序?
我有一个具有以下功能的web应用程序:Entity framework 实体框架-是否适合企业级应用程序?,entity-framework,entity-framework-4.1,Entity Framework,Entity Framework 4.1,我有一个具有以下功能的web应用程序: 1 TB数据库 200多张桌子 至少50个表,每个表包含100多万条记录 10多名开发商 1000个并发用户 此项目当前正在使用由自定义ORM解决方案生成的即席Sql。 我不支持定制ORM(它缺少很多高级功能),而是考虑切换到实体框架 我在一个较小的项目中使用了EF 4.1(代码优先),它运行得很好,但它是否可以扩展到上面更大的项目?合适是一个有趣的术语。它有用吗?是的,您会发现许多非常适合快速应用程序开发的功能。也就是说,它有点不成熟,并且缺少它自己
- 1 TB数据库
- 200多张桌子
- 至少50个表,每个表包含100多万条记录
- 10多名开发商
- 1000个并发用户
我在一个较小的项目中使用了EF 4.1(代码优先),它运行得很好,但它是否可以扩展到上面更大的项目?合适是一个有趣的术语。它有用吗?是的,您会发现许多非常适合快速应用程序开发的功能。也就是说,它有点不成熟,并且缺少它自己的前身LINQtoSQL的许多高级功能(即使在第一次发布3年后)。以下是一些烦恼:
- 复杂LINQ支持较差
- 没有枚举属性类型
- 缺少SQL转换(parse DateTime、parse int等)(尽管您可以通过模型定义的函数实现这些转换)
- SQL可读性差
- 保持多个ssdl/csdl/msl资源独立于切分的问题(首先代码不是真正的问题)
- 在不同ObjectContext中运行多个并发事务的问题
- 分离实体场景的问题
大多数现代的ORM将是自组织SQL的升级。NHibernate是您的最佳选择,因为它很好地支持复杂查询、二级缓存和优化。我认为英孚正在到达那里。如果您正在处理遗留系统,NHibernate是最好的方法 我(高度)同意marvelTracker(和Ayende)的想法 以下是一些进一步的信息: 关键战略 使用guid作为主键有一个众所周知的代价。它由吉米·尼尔森描述,并已在网站上公开。NHibernate支持GUIDCOMB主键策略。然而,在EntityFramework中实现这一点有点棘手,需要额外的步骤 枚举 EntityFramework本机不支持枚举。直到6月CTP增加了对枚举的支持之前,映射枚举的唯一方法是使用变通方法。请查看: 查询: NHibernate提供了许多查询数据的方法:
- LINQ(使用re-motion的re-LINQ提供程序)
- 封装在查询对象中的命名查询
- ICriteria/QueryOver,用于条件未知的查询
- 使用QueryOver投影和聚合(在某些情况下,我们只需要实体的特定属性。在其他情况下,我们可能需要聚合函数的结果,例如平均值或计数):
- PagedQueries:为了避免让用户不知所措,并提高应用程序的响应能力,大的结果集通常被分解成更小的结果页面
- 将多个ICriteria和QueryOver查询组合成单个数据库往返的多查询
- 分离的查询是应用程序部分中的查询对象,无法访问NHibernate会话。然后,这些对象通过会话在别处执行。这很好,因为我们可以用许多方法避免复杂的存储库
// Query that depends on a session:
premises = session.QueryOver<Premise>().List();
// 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.
//依赖于会话的查询:
前提=session.QueryOver().List();
分离式查询器:
// Query that depends on a session:
premises = session.QueryOver<Premise>().List();
// 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.
//完全可重用查询!
var query=QueryOver.Of();
//然后,在应用程序的其他部分中:
premises=query.GetExecutableQueryOver(session.List();//也可以通过一次电话会议。
开源
NHibernate有很多可供选择的捐款项目
该项目为NHibernate提供了许多非常有用的扩展(除其他外):
- 缓存提供程序(用于二级缓存)
- 没有默认构造函数的实体的依赖项注入
- 全文搜索(Lucene.NET集成)
- 空间支持(NetTopologySuite集成)