我們在使用DbContext/Code First的winforms應用程序內部實現實體框架,並且有關如何正確檢查/處理實體在另一個上下文中被刪除/更新的問題的以下問題。檢查實體是否被刪除
例如,我們有一些輔助表數據(例如StateCodes),用戶可以進入另一個表並根據需要添加/刪除狀態。此輔助編輯器表單利用它自己的DbContext並在用戶退出表單後保存更改。在返回到主窗體時,主要上下文不知道對數據庫所做的更改,因此我們希望重新加載實體的DbSet。不幸的是,如果我們刪除「MI」狀態代碼,它仍然存在於DbSet的Local屬性中,即使在我們調用「Load」來引入所有內容之後EntityState仍然保持不變。
完全處置主要上下文之外,以下是檢查並查看實體是否已從數據庫中刪除的最佳方法?
foreach (State state in db.States.Local)
{
DbEntityEntry entry = db.Entry(state);
DbPropertyValues databaseValues = entry.GetDatabaseValues();
if (databaseValues == null)
{
db.States.Remove(state);
}
else
{
entry.OriginalValues.SetValues(databaseValues);
}
}
謝謝您的幫助
謝謝您的回覆。如果我理解正確,那麼下面的邏輯可能是我們最好的選擇:用戶單擊以編輯輔助數據 - 在當前上下文中調用SaveChanges - 處理當前上下文和顯示編輯器給用戶 - 返回時,重新instanstiate上下文和再次通過初始加載數據。 –
@NuNnDaDdY:是的。雖然我認爲你應該在行動中創造背景,例如'buttononClick(){using(Context c = new Context()){c.Entities.Add(e); c.SaveChanges(); }}' –
你能否詳細闡述一下你在創建每個動作內部的原因。我問,因爲我試圖在整個主表單上實現數據綁定,並且有許多主從關係。如果我在每個動作的內部創建一個上下文,我想我不再能夠依靠數據綁定來進行更改跟蹤了,對嗎? –