2011-01-07 108 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。我不知道爲什麼實體框架以這種方式行事,但它適用於我。