2012-06-18 168 views
0

我正在使用Entity Framework 4.1。我已經使用大量的在線示例實現了一個基礎知識庫。我的存儲庫get方法使用bool參數來決定是否跟蹤實體。有時,我想加載一個實體並在其他時間跟蹤它,對於某些實體,我只想讀取它們並顯示它們(即在圖中)。在這種情況下,永遠不需要編輯,所以我不想追蹤它們的開銷。此外,圖形實體被髮送到Silverlight客戶端,因此實體與上下文斷開連接。因此,我的Get方法可以返回被跟蹤或不跟蹤的實體列表。這是動態創建查詢所實現的,如下所示:是否可以判斷一個實體是否被跟蹤?

DbQuery<E> query = Context.Set<E>(); 

// Track the entities in the context? 
if (!trackEntities) 
{ 
    query = query.AsNoTracking(); 
} 

但是,我現在想要讓用戶與圖形進行交互並對其進行編輯。這不會經常發生,所以我仍然想要一些實體沒有跟蹤它們,但有能力保存它們。爲此,我只需將它們附加到上下文並將狀態設置爲已修改。一切工作到目前爲止。

我正在通過重寫SaveChanges方法來審計任何更改。正如上面所解釋的,在一些較低的情況下,我可能需要保存已斷開連接的已修改的實體。因此,爲了進行審計,我必須從數據庫中檢索當前值,然後進行比較以確定斷開連接時發生了什麼變化。如果實體已被跟蹤,則不需要獲取舊值,因爲我可以通過州政府經理訪問它們。我沒有使用自我跟蹤實體,因爲這對我的需求來說太過分了。

問題:在我的審計方法中,我只想知道修改的實體是否被跟蹤,即是否需要轉到db並獲取原始值?

乾杯

回答

0

DbContext.ChangeTracker.Entries(http://msdn.microsoft.com/en-us/library/gg679172(v=vs.103).aspx)返回所有跟蹤的實體DbEntityEntry對象。 DbEntityEntry具有實體屬性,您可以使用該屬性來查明實體是否被跟蹤。像

var isTracked = ctx.ChangeTrackerEntries.Any(e => Object.ReferenceEquals(e.Entity, myEntity)) 
+0

謝謝帕維爾 - 完美的工作! – rockshire

相關問題