2011-01-07 111 views
0

我有一张表映射到实体框架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; 
} 

有关错误发生的原因以及如何使删除工作的任何想法?如果孩子中没有从属行,我从主表中删除没有问题

+0

您可以提供模式定义的相关部分吗? – StriplingWarrior 2011-01-07 18:38:55

回答

0

发现问题。为了获得这些数据,我在屏幕上有两个网格。第一个列出所有项目,第二个列出所选项目的项目成员。我将使用与填充Project网格相同的上下文填充ProjectMember网格。不知何故,我不明白这一部分,产生错误的关系将被建立和执行。但是,如果我使用不同的上下文填充ProjectMember网格,则可以按照预期删除ProjectMembers。我不知道为什么实体框架以这种方式行事,但它适用于我。