2011-04-08 132 views

回答

105

如果你想脫離現有的對象關注@ Slauma的建議。如果要加載的對象,而不跟蹤更改使用:

var data = context.MyEntities.AsNoTracking().Where(...).ToList(); 

正如在評論這不會完全分離的實體提及。他們仍然附加和懶加載工程,但實體不跟蹤。例如,如果您只想加載實體來讀取數據,並且您不打算修改它們,則應該使用該選項。

+2

@Ladislav:這確實可能是Lol編碼器的意思。我從來沒有使用過這種方法,儘管我經常加載對象列表並處理上下文,就像'using(ctx){return ctx .... ToList(); }'。在這種情況下,使用'AsNoTracking()'會很有意義,因爲我會節省不必要的填充對象上下文。我想它可能會有性能和內存消耗的好處,特別是對於大型列表,對吧? – Slauma 2011-04-08 20:23:02

+0

@Slauma:是的,它具有性能優勢。這實際上就是這種方法存在的原因。在ObjectContext API中使用這種方法稍微複雜一些。 – 2011-04-08 21:15:23

+0

這是否禁用延遲加載? – 2011-04-16 03:27:34

161

這是一個選項:

dbContext.Entry(entity).State = EntityState.Detached; 
+2

我可以在檢索返回IQueryable的對象時執行此操作嗎? – 2011-04-08 19:06:49

+0

@Lol編碼器:我不確定我是否理解你,但是'entity'必須是屬於你的模型類(Person,Customer,Order等)的類型的物化對象。您不能直接將IQueryable 傳遞到'dbContext.Entry(...)'中。這是你的問題嗎? – Slauma 2011-04-08 19:37:02

+0

解決方案是什麼? 'AsNoTracking()'或'Include()'或'dbContext.Entry(entity).State = EntityState.Detached;' – 2013-02-06 11:14:45

相關問題