如何在没有往返数据库的情况下从Entity Framework中的对象上下文中分离对象图?

时间:2011-11-24 11:03:46

标签: entity-framework

我的应用程序的工作流程非常简单:

对于给定的一堆脚本

  1. 拍摄剧本
  2. 解析它
  3. 从db
  4. 获取相应的对象图
  5. 更新它,如果没有找到图表则创建新的
  6. 保存更改
  7. 从GC的对象上下文中分离图可能会导致图形
  8. 如果为每个脚本创建了对象上下文但是它影响了性能,则不需要列表的最后一项,而且我希望一些实体存储在上下文中,而其他实体则由GC收集。

    我想过手动分离实体:

    foreach (var desc in component.Descriptions)
       context.ComponentDescription.Detach(desc);
    context.Components.Detach(component);
    

    这种枚举意味着在启用延迟加载的情况下进行db查询。这根本不是一件好事。

    我发现这种方式更像是黑客攻击:

    var entities = context.ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged).Where(
                            e => !(e.Entity is ComponentType));
    entities.Iterate(e => e.ChangeState(EntityState.Detached));
    

    嗯,这不是图表分离,但我知道我可以在我的情况下这样做。但是,如果我需要使用某个图表,如何在不“干扰”db的情况下分离相关属性呢?

1 个答案:

答案 0 :(得分:2)

正如我的问题,问题是调用component.Descriptions,因为如果未加载描述,它会触发延迟加载。所以解决方案应该很容易。在此操作期间临时禁用延迟加载。

context.ContextOptions.LazyLoadingEnabled = false;

foreach (var desc in component.Descriptions)
   context.ComponentDescription.Detach(desc);
context.Components.Detach(component);

context.ContextOptions.LazyLoadingEnabled = true;

我不明白为什么为每个操作创建上下文会影响性能。反过来通常是正确的 - 重用上下文会影响性能。