我有一個DataGridView和DataGridView的DataSource是一個BindingList我從實體框架(V6)通過context.Person.Local.ToBindingList()。 當我將DataSource設置爲此BindingList後,我放棄了上下文,因爲我認爲保持上下文開放將是不好的做法。因此,如果我想添加一個新行,我會點擊「添加」按鈕,隨着BindingNavigator隨我將「人員」對象數據源拖到我的Windows窗體時創建。 每次我點擊「添加」按鈕,我都會得到一個異常,告訴我已經處理了上下文。 使用DataGridView時,我是否需要始終保持上下文打開狀態?哦,並且:DataSource可能會在運行時根據列表框項的選擇而改變。另外,當上下文已經被處理並且我從DataGridView中編輯了一行時,我怎麼能找出(經過多次更改後)哪一行發生了變化? 我試圖做的:保持DbContext打開DataGridView
foreach(DataGridViewRow row in peopleDataGridView.Rows)
{
People item = (People)row.DataBoundItem;
if (item != null)
{
db.People.Attach(item);
}
}
db.SaveChanges();
...但調用SaveChanges()不承認任何變化。但是,如果我強制每個附加項目處於「修改」狀態,它就會起作用。但我不想將100個項目更改爲「修改」,如果只有一個實際修改。
任何想法?
編輯1 哦,所以我改變了我的代碼,以保持上下文打開所有的時間(或至少只要形式被顯示)。 現在,我遇到了一個不同的問題(有些人可能有很多工作):
private void listBox1_SelectedValueChanged(object sender, EventArgs e)
{
People p = (People)listBox1.SelectedItem;
if(p != null)
{
//jobBindingSource.Clear(); this caused another error at runtime...
db.Entry(p).Collection(b => b.Job).Load();
jobBindingSource.DataSource = db.Job.Local.ToBindingList();
}
}
綁定到該jobBindingSource實例DataGridView中顯示了一個人的正確工作,但除了從該職位先前選擇的人。我嘗試了Clear()條目,但是如果我這樣做並且兩次點擊同一個人,那麼datagridview開始有時根本不顯示任何條目。一個奇怪的行爲。 我現在做錯了什麼?
編輯2 好的...我自己找到了解決方案。但我拒絕接受,這是做了正確的方式:
private void listBox1_SelectedValueChanged(object sender, EventArgs e)
{
People p = (People)listBox1.SelectedItem;
if(p != null)
{
db.Dispose();
db = new PeopleJobsEntities();
db.People.Attach(p);
db.Entry(p).Collection(person => person.Job).Load();
jobBindingSource.DataSource = db.Job.Local.ToBindingList();
}
}
只有當我處理的情況下,重新打開它,整個事情的作品。原因是,如果我清除本地緩存(db.Job.Local),即使使用Load()方法,它的條目也不會被重新加載。有沒有辦法強制重新加載實體?
爲什麼不在任何行被編輯或更改後執行此過程否則您需要檢查所有datagr逐行查看idview查看其中哪些已更改 – hasan
此答案可能會幫助您https://stackoverflow.com/a/11520100/8175473 – hasan
@hsnbl我沒有考慮這一點,因爲我希望EF會爲我自動執行此操作。但是隻有當我保持上下文打開的時候,這個自動化才能工作:-( – AudioGuy