次の2つの方法を使用すると、EFを使用してデータベースからアイテムを削除できます。
1つ目はにEntityCollection
あり、2つ目はにありObjectContext
ます。
それぞれいつ使用する必要がありますか?
一方が他方よりも好まれますか?
Remove()
を返し、bool
をDeleteObject()
返しますvoid
。
次の2つの方法を使用すると、EFを使用してデータベースからアイテムを削除できます。
1つ目はにEntityCollection
あり、2つ目はにありObjectContext
ます。
それぞれいつ使用する必要がありますか?
一方が他方よりも好まれますか?
Remove()
を返し、bool
をDeleteObject()
返しますvoid
。
回答:
両方の方法で「データベースからアイテムを削除」できることは、一般的に正しくありません。正確には次のようになります。
ObjectContext.DeleteObject(entity)
エンティティをDeleted
コンテキスト内としてマークします。(それはだEntityState
でDeleted
呼び出す場合は、その後。)SaveChanges
その後EFは、SQLの送信DELETE
データベースに文を。データベースの参照制約に違反していない場合、エンティティは削除されます。違反していない場合は、例外がスローされます。
EntityCollection.Remove(childEntity)
親との関係をchildEntity
Deleted
マークします。場合はchildEntity
、それ自体がデータベースから削除し、何を呼び出すときに正確に起こることはされてSaveChanges
両者の関係の種類によって異なります。
関係がオプションである場合、つまり、データベースの子から親を参照する外部キーでNULL
値が許可されている場合、この外部はnullに設定され、SaveChanges
このNULL
値を呼び出すchildEntity
と、データベースに書き込まれます(つまり、 2つは削除されます)。これはSQL UPDATE
ステートメントで発生します。DELETE
ステートメントは発生しません。
関係が必要で(FKはNULL
値を許可しない)、関係が識別されない(つまり、外部キーが子の(複合)主キーの一部ではない)場合は、子を別の親に追加するか、子を明示的に削除する必要があります(DeleteObject
その場合)。これらのいずれも行わないと、参照制約に違反し、呼び出し時にEFが例外をスローしますSaveChanges
-悪名高い「1つ以上の外部キープロパティがnullにできないため、関係を変更できませんでした」例外または同様。
関係がされた場合の識別(それは必ずしもだ必要なプライマリキーのいずれかの部分ができないため、その後NULL
)EFがマークされますchildEntity
とDeleted
同様。SaveChanges
SQL DELETE
ステートメントを呼び出すと、データベースに送信されます。データベース内の他の参照制約に違反していない場合、エンティティは削除されます。違反していない場合は、例外がスローされます。
私は実際に混乱ビット午前MSDNのページの備考セクションそれが言うので、あなたがリンクしている: " 関係は依存オブジェクトマークの関係および削除の依存オブジェクトの両方のRemoveメソッドを呼び出して、参照整合性制約がある場合。」上記の3つのケースにはすべて「参照整合性制約」があるため、これは不正確または間違っているように見えますが、最後のケースでのみ子が実際に削除されます。(ただし、「依存オブジェクト」とは、通常とは異なる用語になる識別関係に参加するオブジェクトを意味します。)
NULL
「値ではない」と解釈する場合(「値NULL
」を少しずさんに書いたことがあるのではなく)、「オプションの関係」は参照整合性の定義と矛盾しません。
ObjectContext.DeleteObject
何ですか?
Deletedを本当に使用したい場合は、外部キーをnullにできるようにする必要がありますが、結果として孤立したレコードが作成されます(これは、最初にそうすべきではない主な理由の1つです)。だから使うだけRemove()
ObjectContext.DeleteObject(entity)は、エンティティをコンテキストで削除済みとしてマークします。(その後、EntityStateが削除されます。)その後SaveChangesを呼び出すと、EFはSQL DELETEステートメントをデータベースに送信します。データベースの参照制約に違反していない場合、エンティティは削除されます。違反していない場合は、例外がスローされます。
EntityCollection.Remove(childEntity)は、親とchildEntityの関係を削除済みとしてマークします。childEntity自体がデータベースから削除され、SaveChangesを呼び出したときに正確に何が起こるかは、2つの間の関係の種類によって異なります。
注目に値することは、設定.State = EntityState.Deleted
が自動的に検出された変更をトリガーしないことです。 (アーカイブ)