实体框架中的问题删除
问题描述:
我有一张表映射到实体框架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表。
我不想让FKs为空,因为关系必须存在。
删除操作在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;
}
有关错误发生的原因以及如何使删除工作的任何想法?如果孩子中没有从属行,我从主表中删除没有问题
答
发现问题。为了获得这些数据,我在屏幕上有两个网格。第一个列出所有项目,第二个列出所选项目的项目成员。我将使用与填充Project网格相同的上下文填充ProjectMember网格。不知何故,我不明白这一部分,产生错误的关系将被建立和执行。但是,如果我使用不同的上下文填充ProjectMember网格,则可以按照预期删除ProjectMembers。我不知道为什么实体框架以这种方式行事,但它适用于我。
您可以提供模式定义的相关部分吗? – StriplingWarrior 2011-01-07 18:38:55