【问题标题】:How to stop EF from loading entire object graph如何阻止 EF 加载整个对象图
【发布时间】:2011-12-16 00:52:02
【问题描述】:

我有一个 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 服务返回它时,它会因此引发异常。

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

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

    通过所有这些,您告诉 EF 加载整个对象图。每个包含都说:也加载这个关系。

    所以有无限量的来回加载

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

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

    【讨论】:

    • 从已删除的帖子中设置属性不起作用,但通过阅读您的链接答案,我尝试使用 DataContract[IsReference=true] 修改 t4 模板,并且效果很好。谢谢!
    【解决方案2】:

    来自Getting Started with Entity Framework 4 – Lazy Loading

    context.ContextOptions.LazyLoadingEnabled = true;
    

    【讨论】:

    • “我有一个 EF 模型,我将延迟加载设置为 true。”
    • 延迟加载工作正常。我认为这与已经来回加载所有内容有关,这导致它与引用失控。
    【解决方案3】:

    通过添加 .AsNoTracking()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-12
      • 2010-12-12
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      相关资源
      最近更新 更多