1:1のEntityにおけるOnDeleteの不思議な挙動
それにしてもEntity Framework (1.0) の挙動は意味不明ですね。毎回挙動に悩まされます。今回はOnDeleteではまっていました。
データベースで2つのテーブルを用意します。この2つのテーブル同士に外部キーでのリレーションを張り、外部キー制約をつけ、親を削除したときにカスケードでこどもを削除するように定義します。それをそのままEntity Frameworkのモデルに反映します。ふたつのEntityが、1:Nのアソシエーションで接続されたモデルができます。このアソシエーションには自動的にCascadeにOnDelete属性がつきます。クライアント側で親を消すと子のオブジェクトもちゃんとカスケード削除してくれます。まあ期待通りですね。
次に、EDMデザイナでアソシエーションをいじってこれを1:1にしてみます。データベース側には手を入れません。さて、同じように親を削除してみます。例外が発生して削除できません。どうやら、このときは、子も明示的に消さないとダメなようなのです(もしくは取得時にIncludeしておく)
この件に関しては、MSDNの掲示板にこんな投稿がありました。ここでMSのEntity Framework and LINQ to SQLチームのDaniel Simmonsが次のようなことを書いています。
In any case, though, we've talked about this before, and we're filing a bug today to consider taking a change that should fix this behavior. In the meantime, yes, you do have to load the object on the other end.
とあるので、今後直ると思います(EF4で直るといいな)。
ただ、手元の環境ではLoad()だとカスケード削除してくれないように見えるなあ。さっぱりわからん。