我有一个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服务返回它时,它会抛出异常。
答案 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()