2014-11-21 42 views
1

我正在处理一个非常复杂的实体项目。对象图包含大约30个具有两个级别的树(有孩子的孩子)。在第一次更新时优化GraphDiff性能(后续更新很快)

该实体在浏览器中进行管理,并作为Json发送给Web API端点。端点将JSON序列化为复杂的实体,然后存储库使用GraphDiff保存实体。

首次保存时,UpdateGraph调用大约需要12秒,但对同一实体的后续调用需要几毫秒。

我假定图形缓存每个实体我EF DbContext。

有什么办法可以优化第一个电话吗?当我们使用GraphDiff时,我们只有几个场景,也许有一种方法来准备在应用程序中使用的图形。

谢谢你的帮助。

回答

1

我通过克隆GitHub的GraphDiff源代码并修改它来解决它。

GraphDiff动态检测实体的键,并且由于生成动态查询表达式以检索已经存在的对象的方式,每次使用新实体(另一个主键)时,EF都会重新编译该表达式为查询。所以编译后的查询只有在以前使用过实体键时才会被缓存。这些查询编译花了我很多时间(10s)。

源代码被修改为允许注入已经存在的实体。这意味着,不要让GrahpDiff从DB中检索实体,而是以最佳方式检索它,并将其注入以合并到GraphDiff中。