关联属性,噩梦表现(实体框架)

时间:2011-01-27 11:52:19

标签: sql entity-framework entity-framework-4

我有一个相当大的EF4模型,使用POCO代码gen。我有很多实例,我从ID中选择一个表中的单个实体。

但是在某些表上,这需要2分钟或更长时间,在大多数表上需要不到一秒钟。我现在不知道在哪里看,因为我看不出任何理由。它始终是导致问题的相同表,但是我可以直接在数据库中查询它们而不会出现问题,因此它必须位于实体框架领域的某个地方才能解决问题。

这条线非常苛刻:

Dim newProd As New Product
Product.ShippingSize = Entities.ShippingSizes.Single(Function(ss) ss.Id = id)
  • id只是从UI传入的整数,我的实体上的Id是主键,它在数据库上建立索引
  • 实体是我的实体框架datacontext
  • 的新创建的实例
  • 这不是针对Context执行的第一个查询,它是针对此EntitySet的第一个查询,但
  • 我已经重新索引了所有看过帖子的表,这些帖子表明损坏的索引可能导致访问速度慢,这没有任何区别
  • 与其他表完全相同的代码行几乎立即运行,它只是某些表
  • 这张特别的桌子很小 - 里面只有4件东西

有关何处开始的任何建议?

- 编辑 - 我将问题中的代码过度简化到问题消失的程度!

2 个答案:

答案 0 :(得分:1)

从哪里开始?

  1. 打印或记录发送到数据库的实际SQL字符串。
  2. 在服务器上执行该文字字符串并测量其性能。
  3. 使用服务器的EXPLAIN计划系统查看服务器实际执行的操作。
  4. 将原始SQL性能与EF性能进行比较。
  5. 这应该告诉您是否存在数据库问题或EF问题。

答案 1 :(得分:1)

似乎这是POCO模板的Fixup行为与延迟加载相结合的函数。

因为实体已经通过Single加载,后续操作似乎发生在内存而不是数据库中。默认情况下,Fixup方法进行Contains()调用,这是一切都停止的地方,同时检索到成千上万的项目,初始化为代理,并在内存中进行评估。

我尝试将此Contains()更改为Where(Function(x)x.Id = id).Count> 0(在逻辑上会做同样的事情,但试图强制快速数据库操作而不是缓慢的内存操作)。查询仍然在内存中执行,同样慢。

我从POCO切换到标准的EntityGenerator,这个问题就消失了,没有其他变化。说出你对模式/实践的看法,但这是一个令人讨厌的问题 - 在我从假货和小型测试数据库切换到完整大小的数据库之前,我没有发现这一点。实体生成器暂时保存这一天。