我的应用程序的工作流程非常简单:
对于给定的一堆脚本
如果为每个脚本创建了对象上下文但是它影响了性能,则不需要列表的最后一项,而且我希望一些实体存储在上下文中,而其他实体则由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的情况下分离相关属性呢?
答案 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;
我不明白为什么为每个操作创建上下文会影响性能。反过来通常是正确的 - 重用上下文会影响性能。