複合キーを持つ依存オブジェクトのカスケード削除に問題があります。具体的には、EF によって発行された SQL 命令は、依存エンティティの前に主エンティティを削除しようとします。
OnDelete="Cascade"
EF モデルの CSDL と SSDL の両方を設定し、従属エンティティをメモリに明示的に読み込んでいるため、EF はそれらを処理することができます。これは別の FK リレーションシップで正しく機能しており、EF は原則を削除する前に子エンティティを正しく削除します。
ただし、この場合はそうではなく、依存エンティティに複合キーがあるためだと思われます。スキーマを簡単に見てみましょう。
Entity A Entity B Entity A_B
ID (PK) ID (PK) A_ID (PK, FK to A)
B_ID (PK, FK to B)
エンティティ A を削除すると、エンティティ A_B のエントリも削除されます。
ObjectStateManager を調べると、A の A_B エンティティがメモリに読み込まれ、削除対象としてマークされていることがわかりますが、EF は、 A_B を削除する前にA を削除する SQL コマンドを発行します。これは、依存エンティティが独自の PK を持っている場合は正常に機能しますが、複合キーの場合はうまくいかないようです。削除をカスケードする必要があることを EF の FK アソシエーション (SSDL と CSDL の両方) に明示的に伝えても、最初に子を削除しません。
ここでも、A とその A_B の両方がメモリにロードされており、ObjectStateManager はそれらをすべて削除するようにマークしています。プロキシ作成を有効にして POCO を使用していますが、Context に対する LoadProperty 呼び出しを介して子エンティティをメモリに明示的にロードしています。
誰もこれを見たことがありますか?複合キーが本当に問題なのか、それとも単なる気晴らしなのか? あるケースでは EF が SQL コマンドを正しい順序で処理し、別のケースでは処理しないのはなぜですか?
編集: OnDelete ( http://msdn.microsoft.com/en-us/library/cc716734.aspx ) と Relationship Management ( http://msdn.microsoft.com/en-us/ ) の両方のドキュメントを読みました。ライブラリ/ee373856.aspx )。「識別関係と非識別関係に関する考慮事項」というタイトルのセクションは、私がやりたいことが可能であり、実際に期待されていることを暗示しているようです。おそらく、データベースの EF プロバイダー アセンブリ内の何かでしょうか? 私は、SQL Server データベースではなく、IBM.Data.DB2 アセンブリを使用して Informix データベースに対して作業しています。
(さらなる更新: IBM DB2 v9.7fp3a および EF Providers Beta Refresh に更新しました -- http://www.ibm.com/developerworks/forums/thread.jspa?threadID=345634&tstart=0 )