The*_*ev6 5 enterprise-library entity-framework-4.1
问题范围:我想使用EF4.1而不需要权衡我所知道和信任的企业库数据访问块的速度和可靠性.
感谢很多关于EF性能调优的Stackoverflow链接和博客,我发布这种方式,使用与ADO/Enterprise Lib数据访问块(SqlDataReader)的性能相匹配的EF4.1.
项目:1.没有linq到Entities/dynamic sql.我喜欢linq,我只是试着用它来反对对象.2. 100%存储过程并且没有跟踪,没有合并,最重要的是,从不调用.SaveChanges().我只是调用insert/update/delete proc DbContext.StoredProcName(params).在这一点上,我们已经消除了EF的几个快速开发元素,但它为你的存储过程自动创建一个复杂类型的方式对我来说已经足够了.
GetString和类似的方法是一个AbstractMapper,它只是遍历期望的类型并将datareader转换为类型.

所以这是我所关注的标志.采用我所知道的较慢的东西是很难的.

那太快了!!! 慢很多!

那更像是!! 性能饼 根据我的结果,性能饼应该会使跟踪开销增加1%以上,我尝试预先编译视图,没有任何东西像没有跟踪那么大!为什么??也许有人可以参与其中.
所以,这个与Enterprise Lib相比并不公平,但是我正在对数据库进行一次不定时的调用,以加载我理解为每个IIS应用程序池加载一次的元数据.基本上一次在您的应用程序的生命周期.

我使用EF这种方式生成自动存储过程,我使用Linq到Edmx自动导入所有这些edmx函数节点以映射到实体.然后我自动生成每个实体和引擎的存储库.
由于我从不调用SaveChanges,因此我不打算花时间映射到设计器中的存储过程.它需要太长时间,很容易打破它而不知道它.所以我只是从上下文中调用procs.
在我在新的关键任务医疗设备交付网络应用程序中实际实现这一点之前,我将非常感谢任何观察和批评.
谢谢!
只是几点评论:
性能饼根据我的结果,性能饼应该会使跟踪开销增加1%以上,我尝试预先编译视图,没有任何东西像没有跟踪那么大!为什么??
该博客文章来自2008年,因此基于EF版本1和EntityObject衍生实体.使用EF 4.1,您正在使用POCO.变更跟踪与POCO的行为完全不同.特别是当POCO对象从数据库加载到对象上下文时,Entity Framework会创建原始属性值的快照,并且存储位于上下文中.更改跟踪依赖于当前实体值与原始snapshop值之间的比较.在性能和内存消耗方面,创建此快照显然也很昂贵.我的观察结果是它的成本至少为50%(没有变更跟踪的查询时间是变更跟踪的查询时间的一半).你似乎已经衡量了更大的影响.
项目:1.没有linq到Entities/dynamic sql.我喜欢linq,我只是试着用它来反对对象.2. 100%存储过程并且没有跟踪,没有合并,最重要的是,从不调用.SaveChanges().我只是调用insert/update/delete proc DbContext.StoredProcName(params).在这一点上,我们已经消除了EF的几个快速开发元素,但它为你的存储过程自动创建一个复杂类型的方式对我来说已经足够了.
对我来说,这看起来你实际上忽略了实体框架存在的一些主要特征,而且为什么你想要将EF用于你的目的是有疑问的.如果您的主要目标是拥有一个有助于将查询结果具体化为复杂对象的工具,那么您可以看一下专注于此任务的Dapper,并考虑到高性能.(Dapper是Stackoverflow中使用的底层ORM.)
几天前,这里有一个关于EF性能的很好答案的问题.它现在已经迁移到"程序员":