Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架-是否适合企业级应用程序?_Entity Framework_Entity Framework 4.1 - Fatal编程技术网

Entity framework 实体框架-是否适合企业级应用程序?

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(代码优先),它运行得很好,但它是否可以扩展到上面更大的项目?合适是一个有趣的术语。它有用吗?是的,您会发现许多非常适合快速应用程序开发的功能。也就是说,它有点不成熟,并且缺少它自己

我有一个具有以下功能的web应用程序:

  • 1 TB数据库
  • 200多张桌子
  • 至少50个表,每个表包含100多万条记录
  • 10多名开发商
  • 1000个并发用户
此项目当前正在使用由自定义ORM解决方案生成的即席Sql。 我不支持定制ORM(它缺少很多高级功能),而是考虑切换到实体框架


我在一个较小的项目中使用了EF 4.1(代码优先),它运行得很好,但它是否可以扩展到上面更大的项目?

合适是一个有趣的术语。它有用吗?是的,您会发现许多非常适合快速应用程序开发的功能。也就是说,它有点不成熟,并且缺少它自己的前身LINQtoSQL的许多高级功能(即使在第一次发布3年后)。以下是一些烦恼:

  • 复杂LINQ支持较差
  • 没有枚举属性类型
  • 缺少SQL转换(parse DateTime、parse int等)(尽管您可以通过模型定义的函数实现这些转换)
  • SQL可读性差
  • 保持多个ssdl/csdl/msl资源独立于切分的问题(首先代码不是真正的问题)
  • 在不同ObjectContext中运行多个并发事务的问题
  • 分离实体场景的问题
这就是说,微软在这方面投入了大量的精力,希望它能随着时间的推移继续改进。我个人会花时间实现一个抽象良好的存储库/工作单元模式,这样您的代码根本不知道它正在使用EF,如果有必要,您可以在将来切换到另一个LINQ to DB提供程序


大多数现代的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会话。然后,这些对象通过会话在别处执行。这很好,因为我们可以用许多方法避免复杂的存储库
ISession的查询版本:

// 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集成)
支持

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

另外,请看一下: