我正在使用EntityFramework 4来管理简单网格中的数据。我们需要跟踪表格中的复选框。它旨在快速解决从小表中获取数据的问题,而不是大项目。
我在表单中定义了以下内容
private MyDBEntites _context = new MyDBEntities(...);
private BindingSource myBindingSource = new BindingSource(...);
public DataGridView myGrid = new DataGridView();
在我的构造函数中,我填充了网格
int customerID = 1234;
myGrid.DataSource = myBindingSource;
myBindingSource.DataSource = (from cc In _context.myRecords
where cc.CustomerID = customerID
select cc).AsEnumerable();
我的意图是根据需要修改表格。当我完成更改后,我单击一个调用SaveForm()
的按钮public void SaveForm()
{
_context.SaveChanges();
}
对于添加和修改行,这非常有效。但是,当我删除一行,然后调用上面的SaveChanges时,我的应用程序崩溃了“对象处于分离或删除状态”。除非删除一行,否则我什么也没做。
为什么我不能以这种方式删除一行?有人知道在删除之前可能会“改变”吗?如果是这样,你知道如何解决这个问题吗?
更新
我仍然不知道为什么会失败,但我确实有一个解决方法。我试图通过一次“SaveChanges()”调用来排队删除并管理我的所有更改。这没有业务需求。只是个人喜好。相反,我在Remove的末尾放了一个SaveChanges,这样就完美了。
private void myGrid_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
if (e.Row == null)
{
return;
}
if ((MessageBox.Show("Are you certain that you want to delete this entry?", "", MessageBoxButtons.YesNo) == DialogResult.Yes))
{
myRecord req = (myRecord)e.Row.DataBoundItem;
myBindingSource.Remove(req);
_context.myRecords.DeleteObject(req);
_context.SaveChanges();
}
}