質問: ((IObjectContextAdapter)context).ObjectContext; ``` 私はPOCOをEntityObjectに変換するために同様のアダプタが必要です。 助言がありますか? ありがとうございました。
回答: それは**悪い**コードです。 1. それは動作しません。これは`StackOverflowException`で失敗します。コードスニペットをテストソリューションにコピーすることで、今すぐ検証できます。 2. カスケード削除ではありません。カスケード削除はデータベース内で行われますが(エンティティがまだロードされていない場合)、このコードは常に**すべての**ナビゲーションプロパティでクエリを実行してエンティティを読み込み、アプリケーションで削除済みとしてマークします。これらのデータをすべてDBからアプリケーションに転送することで、ひどいオーバーヘッドが発生します。 3. 前の段落のallという言葉は、本当にすべてを意味します=カスケード削除(親から子へ)の通常の流れを尊重しません。このメソッドは、逆方向(子から親へ)で流れることも、再帰的であるため、親のナビゲーションプロパティもロードされ、削除されるためです。それは子供からあなたのデータベースの重要な部分を簡単に削除することができることを意味します! 4. 子エンティティと親エンティティの両方にナビゲーションプロパティがある場合は、無限ループに入ります! 5. `SaveChanges`は再帰関数で呼び出されます。各実行は、その特定の再帰ステップで行われた変更だけでなく、コンテキストからの未処理の変更ごとにデータベースにフラッシュされます。すべてを単一のアトミック操作で保持したい場合は、 `TransactionScope`も必要です。 6. このアプローチは、同時実行性の問題とデッドロックをアプリケーションに導入するための素晴らしい方法です。 7. これは`EntityObject`依存してい`EntityObject` - OMGなぜEF6に関する本には`EntityObject`クラスに関連するコードが含まれていますか? EF4についての古いバージョンからコピーされたコンテンツを持つ現金牛のように見えます。 ObjectContext APIではなく、 `EntityObject`とは何もありませんか?本当に? 要するに、カスケード削除をしたい場合、またはカスケード削除を使用せず、手動で(好ましくは直接SQLを使用して)削除依存関係を削除する場合は、DBおよびエンティティモデルを修正してください。トリガーを使用してそのSQLを実行するオプションもありますが、トリガーを適切なオプションとして考慮していません。