まず、私のエラーから始めましょう:
「XとYの間の関係を削除しようとしました。ただし、関係の外部キーの1つをnullに設定することはできません。」
今私がやろうとしていることの説明のために...
私は次のデータベーステーブルを持っています:標本、男性、女性、標本関係。男性は常に標本であり、女性は常に標本です。したがって、標本には2つの1対多の関係があります(ただし、ロジックにより、標本に両方が設定されることはありません)。また、男性は1対多のガールフレンドを持つことができ、同様に女性は1対多のボーイフレンドを持つことができます(ねえ、これは結局21世紀です)。これは、多対多のテーブル(SpecimenRelationship)を作成することで解決されました。
SQLの関係は、標本の削除が男性と女性の両方にカスケードされるように設定されています。その後、必要な機能は、男性/女性を削除してSpecimenRelationshipにカスケードすることですが、SQLの制約(複数のサイクルパスのゴミ!)のため、これは実行されません。したがって、一方はカスケードし、もう一方はSetNullです(男性がSetNullであるとしましょう)。
さて、すべてがうまくいかない部分についてです。男性エンティティからSpecimenRelationshipを削除すると、上記のエラーが発生します。しかし、なぜこれが起こるのでしょうか?男性エンティティを削除している場所がわかりません。Linq-to-Sqlがどのように機能するかを理解していません。なぜこれはSpecimenRelationshipエントリの単なる削除ではないのですか?
次にいくつかのサンプルコードを示します。
Male male = GetMaleFromDataContext();
SpecimenRelationship relationshipToRemove = male.SpecimenRelationships.Single(x => x.FemaleID == someFemaleID);
male.SpecimenRelationships.Remove(relationshipToRemove);
DB.SubmitChanges();//error thrown here
なぜ関係カスケードがここで機能するのですか?