如何阻止EF加载整个对象图

时间:2011-12-16 00:52:03

标签: c# .net entity-framework

我有一个EF模型,我将延迟加载设置为true。我这样查询:

public static WorkflowStatus Get(int id)
{
    WorkflowStatus status;
    using (var db = new WorkflowDb())
    {
        status = db.WorkflowStatuses
            .Include("CurrentMappings")
            .Include("CurrentMappings.NextWorkflowStatus")
            .Include("NextMappings")
            .Include("NextMappings.CurrentWorkflowStatus")
            .Include("WorkQueueWorkflowStatusMaps")
            .Include("WorkQueueWorkflowStatusMaps.WorkQueue")
            .FirstOrDefault(x => x.Id == id);
    }
    return status;
}

在我获得状态后,不仅仅是填充了这些东西。例如,每个WorkQueueWorkflowStatusMap都有一个WorkQueue,而WorkQueue有一个WorkQueueWorkflowStatusMaps的集合 - 因此会有无限量的来回加载。我如何让它停下来?当我通过另一层中的WCF服务返回它时,它会抛出异常。

3 个答案:

答案 0 :(得分:2)

  

如何阻止EF加载整个对象图?

通过所有这些包括你告诉EF加载整个对象图。每个包含说:加载这种关系。

  

所以有无限量的来回加载

没有。实体只加载一次。您看到的是循环参考,它包含在您的模型中。如果您的WorkQueueWorkflowStatusMap具有WorkQueue导航属性并且同时WorkQueue具有WorkQueueWorkflowStatusMap导航属性,则建模循环引用绝对正确,直到您尝试序列化您的实体为止= WCF中的问题。在这种情况下you must inform serializer使用循环引用。

如果你想使用序列化和WCF,你应该关注@Eranga删除的答案 - 关闭延迟加载和代理创建。

答案 1 :(得分:0)

来自Getting Started with Entity Framework 4 – Lazy Loading

context.ContextOptions.LazyLoadingEnabled = true;

答案 2 :(得分:0)

通过添加 .AsNoTracking()

停止深度加载
db.WorkflowStatuses.Include(s => s.childObject)
             .AsNoTracking()