【问题标题】:"Out of Memory" exception while retrieving a lazy-loaded list in Entity Framework在实体框架中检索延迟加载列表时出现“内存不足”异常
【发布时间】:2013-01-05 11:54:12
【问题描述】:

访问实体列表时,系统抛出“内存不足”异常。

调用堆栈有一个重复调用块,直到应用程序内存不足。

调用栈:

.
.
.
at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.VisitNode(Node n)
/* Repeating Block */
at System.Data.Query.InternalTrees.BasicOpVisitorOfNode.VisitChildren(Node n)
at System.Data.Query.PlanCompiler.JoinElimination.VisitDefaultForAllNodes(Node n)
at System.Data.Query.PlanCompiler.JoinElimination.VisitDefault(Node n)
at System.Data.Query.InternalTrees.BasicOpVisitorOfNode.VisitPhysicalOpDefault(PhysicalOp op, Node n)
at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.Visit(PhysicalProjectOp op, Node n)
at System.Data.Query.InternalTrees.PhysicalProjectOp.Accept[TResultType](BasicOpVisitorOfT`1 v, Node n)
at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.VisitNode(Node n)
/* Repeating Block */
at System.Data.Query.PlanCompiler.JoinElimination.Process()
at System.Data.Query.PlanCompiler.PlanCompiler.Compile(List`1& providerCommands, ColumnMap& resultColumnMap, Int32& columnCount, Set`1& entitySets)
at System.Data.Query.PlanCompiler.PlanCompiler.Compile(DbCommandTree ctree, List`1& providerCommands, ColumnMap& resultColumnMap, Int32& columnCount, Set`1& entitySets)
at System.Data.EntityClient.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory, DbCommandTree commandTree)
at System.Data.EntityClient.EntityProviderServices.CreateCommandDefinition(DbProviderFactory storeProviderFactory, DbCommandTree commandTree)
at System.Data.EntityClient.EntityProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree)
at System.Data.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree)
at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Prepare(ObjectContext context, DbQueryCommandTree tree, Type elementType, MergeOption mergeOption, Span span, ReadOnlyCollection`1 compiledQueryParameters, AliasGenerator aliasGenerator)
at System.Data.Objects.EntitySqlQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.Execute(MergeOption mergeOption)
at System.Data.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption)
at System.Data.Objects.DataClasses.EntityCollection`1.Load(MergeOption mergeOption)
at System.Data.Objects.DataClasses.RelatedEnd.Load()
at System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad()
at System.Data.Objects.Internal.LazyLoadBehavior.LoadProperty[TItem](TItem propertyValue, String relationshipName, String targetRoleName, Boolean mustBeNull, Object wrapperObject)
at System.Data.Objects.Internal.LazyLoadBehavior.<>c__DisplayClass7`2.<GetInterceptorDelegate>b__1(TProxy proxy, TItem item)

关于这里可能是什么问题的任何线索,或者关于如何调试问题的一些提示?

我试图建模的层次结构有点大,有 3 级继承:

大约有 20 个类派生自 A1,大约 30 个类派生自 A2。当我尝试访问“A”类型的对象时,系统会“内存不足”。问题似乎在于 EF 如何尝试生成执行计划和相应的 SQL 来访问“A”类型的项目。

【问题讨论】:

  • 你应该显示相应的代码...
  • 也许你的模型中有一些递归?如果您添加一些代码会有所帮助
  • 问题可能是集合有 1 亿个实体。
  • 是的。我将研究“模型中的递归”。如果这没有帮助,肯定会为你添加一些代码来帮助我。

标签: asp.net .net entity-framework


【解决方案1】:

我能够解决将映射从 TPT 移动到 TPH 的问题。我还必须通过重命名具有相同名称的列来避免在 EF Code First 中使用 a documented bug

现在我遇到了一个跨小时的 EF 启动时间问题。我已经在 SO here 发布了同样的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多