我有一个相当大的EF4模型,使用POCO代码gen。我有很多实例,我从ID中选择一个表中的单个实体。
但是在某些表上,这需要2分钟或更长时间,在大多数表上需要不到一秒钟。我现在不知道在哪里看,因为我看不出任何理由。它始终是导致问题的相同表,但是我可以直接在数据库中查询它们而不会出现问题,因此它必须位于实体框架领域的某个地方才能解决问题。
这条线非常苛刻:
Dim newProd As New Product
Product.ShippingSize = Entities.ShippingSizes.Single(Function(ss) ss.Id = id)
有关何处开始的任何建议?
- 编辑 - 我将问题中的代码过度简化到问题消失的程度!
答案 0 :(得分:1)
从哪里开始?
这应该告诉您是否存在数据库问题或EF问题。
答案 1 :(得分:1)
似乎这是POCO模板的Fixup行为与延迟加载相结合的函数。
因为实体已经通过Single加载,后续操作似乎发生在内存而不是数据库中。默认情况下,Fixup方法进行Contains()调用,这是一切都停止的地方,同时检索到成千上万的项目,初始化为代理,并在内存中进行评估。
我尝试将此Contains()更改为Where(Function(x)x.Id = id).Count> 0(在逻辑上会做同样的事情,但试图强制快速数据库操作而不是缓慢的内存操作)。查询仍然在内存中执行,同样慢。
我从POCO切换到标准的EntityGenerator,这个问题就消失了,没有其他变化。说出你对模式/实践的看法,但这是一个令人讨厌的问题 - 在我从假货和小型测试数据库切换到完整大小的数据库之前,我没有发现这一点。实体生成器暂时保存这一天。