2015-09-25 215 views
4

在實體框架(6.1.3)的DbSet實體集合中,添加新項目時,以後不會從集合返回。這是奇怪的和意外的。以下是一些收集的示例代碼:DbSet:缺少添加項目

dbContext.Entities.ToArray(); 
// contains 3 entries 
dbContext.Entities.Add(new Entity()); 
dbContext.Entities.ToArray(); 
// still contains 3 entries 

這是怎麼回事?當我在Visual Studio的直接窗口中查詢dbContext.Entities時,它會說「Local:Count = 4」。爲什麼它會隱藏我的新項目?

更新:如果這個集合沒有做明顯的事情 - 返回之前添加的東西 - 我需要做些什麼呢?它首先被調用時必須返回數據庫中的所有記錄,並且必須在稍後調用時包含所有更改(添加和刪除)。 SaveChanges僅在用戶編輯完成後調用。之前需要收集!當用戶完成編輯時,SaveChanges也可能在某個地方被調用,但代碼可能會返回並在稍後再次顯示該視圖。

+0

你嘗試'context.Entities.Find(ID)'? – Andrei

+0

'Entities'只是一個查詢,'ToArray()'將通過從數據庫中提取來實現查詢(並且可能***合併一些本地緩存的結果)。在這種情況下,您的新實體不會在本地緩存以及保存到數據庫,因此完全沒有結果。 – Hopeless

+0

「Local:Count = 4」輸出並不表示它已被緩存?當我添加東西,而他們沒有被緩存,那麼他們將如何得到保存呢?保存工作正常,但我只能在程序重啓後到達那裏。我需要立即購買新產品。 – ygoe

回答

4

A DbSet有一個屬性Local。這是包含所有元素的ObservableCollectionDbSet對象本身僅表示對數據庫的查詢。

Local屬性的文檔:

獲取表示在這個組中的所有 增加,持平和修改實體的局部視圖一個ObservableCollection。隨着實體從上下文添加或刪除,此本地視圖 將保持同步。 同樣,添加到本地視圖或從本地視圖中刪除的實體將自動添加到上下文或從上下文中刪除。

所以,如果你想訪問的元素,總是使用Local屬性來做到這一點。

+0

我已經將我的代碼更改爲將所有記錄加載到本地集合中,然後從中獲取所有相關項目。我不應該忘記寫額外的'.Local',否則會導致意外的行爲。 'Add'和'Remove'直接使用'DbSet'。 – ygoe

0

您必須保存更改。嘗試

dbContext.State = EntityState.Added; 
dbContext.SaveChanges(); 
+0

我不想在編輯過程中保存更改。 – ygoe

+0

那麼,直到您保存更改後,數據庫纔會更改。 dbContext.Entities.Add(新實體())只是暫存更改。 – dylanthelion

+0

並且要清楚:dbContext.Entities.ToArray()確實查詢數據庫,就像(我認爲)所有其他不改變數據庫的方法一樣。 .Add(),.Delete和(我認爲)所有其他會改變數據庫的方法都不會。 – dylanthelion

2

添加新的實體後,必須保存使用的DbContext對象的變化,使用 dbContext.SaveChanges();或dbContext.EntityState.Added

+0

查看其他答案。我現在無法保存更改。我還沒有完成編輯。我怎樣才能得到所有未保存的物品加上保存的物品呢? – ygoe

0

你可以用下面的代碼獲取的所有項目,

foreach (var track in dbContext.ChangeTracker.Entries()) 
{ 
    if (track.State == EntityState.Deleted) 
     Entity s = (Entity)track.OriginalValues.ToObject(); 
    else 
     Entity s = (Entity)track.CurrentValues.ToObject(); 
}