2

通过导航属性从集合对象中删除对象时,我遇到了严重的性能问题。调用 EntityCollection.Remove 需要 8 分钟 (!!!!) 才能完成

详细信息:CollectionObject X 有 65.000 个对象。只有其中一个应该从集合中删除。

没有太多自己的代码涉及,即 EntityCollection 是通过(生成的代码)创建的

RelationshipManager.GetRelatedCollection<...>(<relationShipName>, <targetRoleName>)

而实际的 Remove 只是一个调用

EntityCollection<Type>.Remove

我怀疑 EntityFramework 在执行实际删除之前会加载所有 65.000 个对象。然而,到目前为止,我还无法证明这个假设。

有任何想法吗?

谢谢弗兰克

附加信息:我发现这个有用的链接: EF 构建 EntityCollection,但我(我认为我)想要 IQueryable 问题的真正原因是 EntityCollection 在执行删除时的行为。

我找到了一种解决方法并使用关系的较小端,即当我想删除从对象 A 到对象 B 的关系时,当对象 A 有 65000 个对象时,我从对象 B 端删除关系,其中性能没关系,因为对象 B 仅与例如 10 个对象相关。显然,这不是该问题的令人满意的通用解决方案。

4

1 回答 1

1

是的,它可能会在删除之前加载所有对象。您可以使用 SQL Server 附带的 SQL Profiler 工具来验证这一点。

就删除对象而言,如果您需要获取此导航属性,您可以在 EntityReference 上使用 CreateSourceQuery。如果您的导航属性称为 Candles,则默认情况下会调用 CandlesReference 的 EntityReference。所以你的删除看起来像这样:

var victim = entity.CandlesReference.CreateSourceQuery().Single(c => .....);
context.DeleteObject(victim);
context.SaveChanges();

这将获得本应执行的查询,并让您有机会选择您想要的查询,而无需先获取所有内容。

假设您有必要的信息,直接查询可能更有效,例如

var victim = context.Candles.Single(c => ....);
于 2012-04-24T18:28:10.960 回答