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()だとカスケード削除してくれないように見えるなあ。さっぱりわからん。