我在实体框架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;
}
有关错误发生原因以及如何使删除工作的任何想法?如果子项中没有依赖行
,我从主表中删除没有问题答案 0 :(得分:0)
发现问题。为了得到这些数据,我在屏幕上有两个网格。第一个列出了所有项目,第二个列出了所选项目的ProjectMembers。我将使用用于填充项目网格的相同上下文填充ProjectMember网格。不知何故,我不明白这一部分,会产生并强制产生错误的关系。但是,如果我使用不同的上下文填充ProjectMember网格,我可以像您期望的那样删除ProjectMembers。我不知道为什么实体框架会以这种方式运行,但它对我有用。