[解決済み] Entity Framework .Remove() と .DeleteObject() の比較
質問
EFを使用してデータベースから項目を削除するには、次の2つの方法を使用します。
1つ目は
EntityCollection
で、2つ目は
ObjectContext
.
それぞれどのような場合に使用するのでしょうか?
どちらを選ぶべきですか?
Remove()
は
bool
と
DeleteObject()
は
void
.
どのように解決するのですか?
一般に、" ができることは正しくありません。 データベースから項目を削除する というのは一般に正しくありません。正確にはこのようになります。
-
ObjectContext.DeleteObject(entity)
マーク としてエンティティをDeleted
という文脈になります。(これはEntityState
はDeleted
の後に続く) もし、あなたがSaveChanges
を呼び出すと、EF は SQLDELETE
ステートメントをデータベースに送信します。データベース内の参照制約に違反しない場合、エンティティは削除され、そうでない場合は例外がスローされます。 -
EntityCollection.Remove(childEntity)
マーク 親とchildEntity
としてDeleted
. もしchildEntity
を呼び出すと、それ自体はデータベースから削除され、具体的に何が起こるのでしょうか?SaveChanges
を呼び出したときに何が起こるかは、2つの関係の種類に依存します。-
もしその関係が 任意 である場合、すなわち、データベースで子から親を参照する外部キーによって
NULL
の値がある場合、この外部キーは null に設定され、もしSaveChanges
このNULL
の値はchildEntity
の値はデータベースに書き込まれます (つまり、2 つの間の関係が取り除かれます)。この現象は、SQLUPDATE
ステートメントで行われます。いいえDELETE
ステートメントが発生します。 -
もしリレーションシップが 必須 (FKでは
NULL
値を許しません)、関係は を特定しない (つまり、外部キーが子の (合成) 主キーの一部ではない) 場合は、その子を別の親に追加するか、 明示的にその子を削除しなければなりません (そのためには、(DeleteObject
で) 削除しなければなりません。これらのいずれかを行わないと、参照制約に違反することになり、EFは、以下のように呼び出すと例外をスローします。SaveChanges
- 悪名高き " 外部キー プロパティの 1 つまたは複数が NULL 値でないため、リレーションシップを変更できませんでした。 " という例外が発生します。 -
もしリレーションシップが 識別 (それは必ずしも 必須 では主キーのどの部分も
NULL
にはできないので) EF はchildEntity
としてDeleted
も同様です。もしあなたがSaveChanges
を呼び出すと、SQLDELETE
ステートメントがデータベースに送信されます。データベース内の他の参照制約に違反しない場合はエンティティが削除され、そうでない場合は例外がスローされます。
-
実はちょっと混乱しているのが MSDN ページにある Remarks セクション と書かれているためです。 リレーションシップに参照整合性制約がある場合、依存オブジェクトで Remove メソッドを呼び出すと、リレーションシップと依存オブジェクトの両方が削除されるようにマークされます。 とあります。上記の 3 つのケースにはすべて " があるため、これは適切でない、あるいは間違っているように思えます。 参照整合性制約 しかし、最後のケースだけは実際に子供が削除されるからです。(彼らが " で意味しない限り; 従属オブジェクト という意味でない限り、識別関係に参加するオブジェクトを意味します(これは珍しい用語でしょう)。
関連
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] Entity Framework 5 レコードを更新する
-
[解決済み] Entity FrameworkとLINQ to SQLの比較
-
[解決済み] Entity Frameworkにおける最速の挿入方法
-
[解決済み】マルチインデックスとマルチカラムインデックスの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み] 関数を終了するには?
-
[解決済み】1つ以上の外部キーのプロパティが非NULLであるため、リレーションシップを変更できませんでした。