2011-11-24 10 views
1

我的應用程序的工作流程非常簡單:如何從實體框架中的對象上下文中分離出一個對象圖,而不是往返於數據庫?

對於腳本的給定一串

  1. 採取腳本
  2. 解析它
  3. 得到分貝
  4. 更新對應的對象圖,或如果未找到圖形,則創建新圖形
  5. 保存更改
  6. 從對象上下文中分離圖對於GC可以殺死圖形

如果爲每個腳本創建對象上下文,但它會影響性能,列表的最後一個項目是沒有必要而且我想要一些存儲在上下文,而其他實體的GC收集。

我想手動分離的實體:

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

這樣的枚舉意味着數據庫查詢中啓用了延遲加載的情況下。這根本不是一件好事。

我發現這種方式更像是一個黑客:

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

好吧,它不是一個圖形拆卸,但我只知道我可以在我的情況下做到這一點。但是如果我需要使用特定的圖表,我怎麼能分離相關的屬性而不'干擾'分貝?

回答

1

因爲我的問題是component.Descriptions,因爲如果沒有加載描述,它會觸發延遲加載。所以解決方案應該很容易。臨時禁用此操作期間的延遲加載。

context.ContextOptions.LazyLoadingEnabled = false; 

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

context.ContextOptions.LazyLoadingEnabled = true; 

我不明白你爲什麼要爲每個操作創建上下文來影響性能。反之亦然 - 重用上下文會影響性能。

+0

>我不明白爲什麼創建每個操作的上下文會影響性能。 1)重新連接(與池沒有關係) 2)需要保存上下文的某些部分 –

相關問題