2013-09-27 25 views
0

我有一個WPF窗口上的數據網格,它顯示我的用戶列表。這個代碼可以正常工作。實體不提供WPF數據網格中的最新信息C#

private void UpdateGrid() 
{ 
    var query = db.Users; 
    GridUsers.ItemsSource = query.ToArray(); 
} 

有一個編輯按鈕,它在上一個窗口頂部打開一個新窗口,並允許您編輯其中一個用戶。當我完成編輯時,會有一個調用db.savechanges的保存。這一切工作正常,如果我把一個斷點那裏的變化發生在我的SQL數據庫。然後關閉此窗口,並在用戶屏幕上再次調用UpdateGrid方法。 datagrid不會更新以顯示SQL表中的新值。我還有另一個按鈕,用於添加和刪除用戶,並且在執行完這些任務之一後調用UpdateGrid方法時,數據網格是最新的。

爲什麼這不會正確更新我的datagrid?

更新: 我修復了這個問題。我仍然不確定它爲什麼會發生。我的用戶屏幕有一個從空開始的全局用戶變量。以下代碼在按下編輯按鈕時進行設置。

WorkingUser = (User) GridUsers.SelectedItem; 

編輯屏幕,然後用下面的代碼,以獲得正確的實體。

User editUser = (from s in db.Users where (s.UserName == ManageUsers.WorkingUser.UserName) select s).FirstOrDefault(); 

當db.users.remove(editUser)被調用,然後db.savechanges被調用,數據網格更新工作正常。但是,當我編輯editUser並調用db.savechanges時,dataGrid無法正確顯示。我意識到我不必做選擇,而只是使用下面的代碼。

User editUser = ManageUsers.WorkingUser 

現在,當我編輯editUser時,updateGrid工作正常。

回答

0

它可能取決於你在哪裏定義變量:db。 如果它是實體框架ObjectContext,並且它是定義UpdateGrid方法的類中的實例變量,則無論其他人是否更新了持久性存儲中的數據,您都將在首次執行查詢時始終實現客戶端實體。

發生這種情況是因爲默認情況下,標識解析發生在AppendOnly的MergeOptions中。 請參閱此處以獲取進一步說明:http://msdn.microsoft.com/en-us/library/vstudio/bb896269%28v=vs.100%29.aspx的段落:標識解析和合並選項。

如果使用新的ObjectContext打開一個新窗口來更改數據庫數據,則在第一個ObjectContext中將不會有這些更改的證據。 如果您恰好在新窗口或其他地方添加客戶,那麼您將獲得新添加的客戶證據。就現有的客戶實例而言,他們的屬性不會在網格中更新。

您可以在每次調用UpdateGrid時間創建上下文的新實例,或者你可以改變你的上下文配置如下解釋:

How to force EF Code First to query the database?

相關問題