2011-01-07 7 views
0

Entity Framework 4にマッピングされているテーブルが、他のいくつかのテーブルの子テーブルです。そのテーブルの行を削除しようとするたびに、以下のメッセージが表示されます。このテーブルには他のテーブルへの複数の外部キーがありますが、関係の子テーブルは常にプライマリではありません。このメッセージは、私がcontext.DeleteObject(オブジェクト)を呼び出すとすぐに発生し、呼び出されたcontext.SaveChanges()は必要ありません。すべての関係が.edmxデザイナで正しく定義されていることを確認しました。Entity Frameworkでの削除に関する問題

メッセージ: 操作が失敗しました:1つ以上の外部キーのプロパティがnullにできないため、関係を変更できませんでした。リレーションシップが変更されると、関連する外部キー・プロパティーはNULL値に設定されます。外部キーがNULL値をサポートしていない場合は、新しい関係を定義する必要があります。また、外部キー・プロパティーに別の非NULL値を割り当てる必要があります。

テーブルプロジェクトごとに

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

スキーマ定義の関連部分を提供できますか? – StriplingWarrior

+0

私はより多くの情報で投稿を更新しました。他に何かが必要な場合は、私に知らせてください。 – Doug

答えて

0

問題が見つかりました。このデータを取得するには、画面上に2つのグリッドがあります。最初のプロジェクトはすべてのプロジェクトをリストし、2番目のプロジェクトは選択したプロジェクトのProjectMembersをリストします。私は、ProjectMemberグリッドに、プロジェクトグリッドを埋めるために使用されたのと同じコンテキストを使用して移入します。何とか、私はこの部分を理解していない、エラーを作り出した関係が確立され、実施されます。しかし、別のコンテキストを使用してProjectMemberグリッドを作成した場合、ProjectMemberを削除することができます。なぜEntity Frameworkがこのように動作するのかわかりませんが、それは私にとってはうまくいきます。

関連する問題