我在测试与EF-Compact 3.5数据库接口的应用程序时遇到了瓶颈。
通常,当我遇到这样的瓶颈时,我重写linq查询以减少linq查询的数量,因为在填充了数千个条目的数据库上重新运行相同的linq查询十几次会创建一些高架。然后,我使用plinq来加速实例化时间。
在我尝试使用ShapeEntities表进行此操作之前,这样做效果相当不错。
ShapeEntity是一个抽象实体,它作为其他几乎完全相同的实体的基类。我无法使用AsParallel()方法运行它。
HashSet<Guid> keys ...
var x =
from shape in model.ShapeEntities.AsParallel()
where keys.Contains(shape.ImageKey)
select shape;
List<ShapeEntity> shapes = new List<ShapeEntity>(x);
如果我要从上面的代码中删除AsParallel(),那么当我们将它放入列表时,查询大约需要1.4秒。使用AsParallel()方法,我在大约40秒后得到一个AccessViolationException。它永远不会过去实例化。
有没有人对如何提高速度有任何想法?我无法做ImageEntity.ShapeEntities,因为每个ImageEntity会变成1.2秒。
答案 0 :(得分:0)
实体框架上下文不是线程安全的。 From MSDN
ObjectContext类不是线程安全的。数据的完整性 在多线程中无法确保ObjectContext中的对象 场景。
如果您为了只读目的检索这些实体,则可以使用NoTracking
MergeOption
model.ShapeEntitie.MergeOption = MergeOption.NoTracking;
否则实现一些分页机制。