在实体框架中删除问题

时间:2011-01-07 18:35:26

标签: entity-framework entity-framework-4

我在实体框架4中映射了一个表,该表是其他几个表的子表。每次尝试删除该表中的行时,我都会收到以下消息。此表具有多个其他表的外键,但它始终是关系中的子表,而不是主表。一旦调用context.DeleteObject(object),就会发生此消息,它不需要调用context.SaveChanges()。我已经验证在.edmx设计器中正确定义了所有关系。

消息: 操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

表格

Project (1)  -   (many) ProjectMember (many)  -  (1) Employee
   ProjectID (PK)            ProjectMemberID (PK)         EmployeeID (PK)
   ProjectName (varchar)     ProjectID (FK)               FirstName (varchar)
                             EmployeeID (FK)              LastName (varchar)
                             Role (varchar)

对于每个项目,我有多个ProjectMembers来自公司的员工列表。删除ProjectMember不应影响Project或Employee表。

我不希望FK可以为空,因为关系必须存在。

当对行执行删除时,从WPF 4数据网格中删除。我拦截了删除键并调用了context.DeleteObject()。

CommandManager.AddPreviewExecutedHandler(grid, new ExecutedRoutedEventHandler(gridDeleteCommandHandler));

private void gridDeleteCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
   if (e.Command == DataGrid.DeleteCommand)
   {
    if (grid.SelectedItem is ProjectMember)
    {
        ProjectMember pm = (ProjectMember)grid.SelectedItem;
        _context.DeleteObject(pm);
        SaveChanges();
    }
   }
    e.Handled = true;
}

有关错误发生原因以及如何使删除工作的任何想法?如果子项中没有依赖行

,我从主表中删除没有问题

1 个答案:

答案 0 :(得分:0)

发现问题。为了得到这些数据,我在屏幕上有两个网格。第一个列出了所有项目,第二个列出了所选项目的ProjectMembers。我将使用用于填充项目网格的相同上下文填充ProjectMember网格。不知何故,我不明白这一部分,会产生并强制产生错误的关系。但是,如果我使用不同的上下文填充ProjectMember网格,我可以像您期望的那样删除ProjectMembers。我不知道为什么实体框架会以这种方式运行,但它对我有用。