C# 为什么我会得到;对象处于分离或删除状态;删除未修改的行时?

C# 为什么我会得到;对象处于分离或删除状态;删除未修改的行时?,c#,winforms,entity-framework,C#,Winforms,Entity Framework,我使用EntityFramework 4在一个简单的网格中管理数据。我们只需要跟踪表中的复选框就可以了。它的目的是快速修复从一个小表中获取数据,而不是从一个大项目中获取数据 我在表格中定义了以下内容 private MyDBEntites _context = new MyDBEntities(...); private BindingSource myBindingSource = new BindingSource(...); public DataGridView myGrid = new

我使用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()的按钮

对于添加和修改行,这非常有效。但是,当我删除一行,然后调用上面的SaveChanges时,我的应用程序会崩溃,“对象处于分离或删除状态”。甚至当我除了删除一行什么都没做的时候也是这样

为什么我不能这样删除一行?有人知道删除前可能会“更改”什么吗?如果是这样的话,你知道我如何解决这个问题吗

更新

我仍然不知道为什么会失败,但我确实有一个解决办法。我试图通过一个“SaveChanges()”调用来排队删除并管理我的所有更改。这在商业上是没有必要的。只是个人喜好。相反,我在删除的末尾放了一个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();
    }
}

只是一个猜测,但是您是否正在从用于渲染网格的任何支持数据模型中删除该行?可能是网格试图渲染删除的对象时出错了。有趣的想法。我不这么认为。为了测试这一点,我修改了代码以手动处理删除。我从绑定源中删除它,然后从
\u context
中删除对象。我在保存时也会遇到同样的错误。我不认为这是根本问题。实体框架在绑定网格时不能很好地工作。根据我的经验,其他控件工作得很好,但网格不行。我做了很多。我使用Telerik和Infragistics(没有尝试内置的Microsoft网格)所做的是控制网格中行的添加和删除。如果存在相关(FK关系)实体,只需从下拉列表中选择某个内容到网格中的列,即可将该实体添加到上下文中。如果要取消对该行的编辑,则需要手动将其删除。我认为你处理得对。
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();
    }
}