在继承的实体上运行PLINQ会引发AccessViolationException

时间:2012-02-11 00:58:37

标签: entity-framework sql-server-ce single-table-inheritance

我在测试与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秒。

1 个答案:

答案 0 :(得分:0)

实体框架上下文不是线程安全的。 From MSDN

  

ObjectContext类不是线程安全的。数据的完整性   在多线程中无法确保ObjectContext中的对象   场景。

如果您为了只读目的检索这些实体,则可以使用NoTracking MergeOption

来节省几毫秒
model.ShapeEntitie.MergeOption = MergeOption.NoTracking; 

否则实现一些分页机制。