엔터티 프레임 워크 .Remove () 대 .DeleteObject ()


141

다음 두 가지 방법을 사용하여 EF를 사용하여 데이터베이스에서 항목을 제거 할 수 있습니다.

첫 번째는에 EntityCollection상기 두 번째 ObjectContext.

각각 언제 사용해야합니까?

하나는 다른 것보다 선호됩니까?

Remove()a boolDeleteObject()반환 하고를 반환합니다 void.

답변:


275

두 가지 방법으로 " 데이터베이스에서 항목을 제거 "할 수있는 것은 일반적으로 올바르지 않습니다 . 정확하게 말하자면 다음과 같습니다.

  • ObjectContext.DeleteObject(entity)컨텍스트에서와 같이 엔티티를Deleted 표시 합니다 . (그것의가 EntityState있다 Deleted그 후.) 당신이 호출하면 SaveChanges이후에 EF는 SQL의 전송 DELETE데이터베이스에 문을. 데이터베이스의 참조 제한 조건을 위반하지 않으면 엔티티가 삭제되고 그렇지 않으면 예외가 발생합니다.

  • EntityCollection.Remove(childEntity)parent와 childEntityas 의 관계를Deleted 표시 합니다 . 는 IF childEntity자체는 데이터베이스에서 삭제하고 당신이 호출 할 때 정확하게 일이되어 SaveChanges둘 사이의 관계의 종류에 따라 달라집니다

    • 관계가 옵션 , 즉 데이터베이스에 부모에게 아이에서 참조하는 외래 키 허용 NULL값이 외국은 null로 설정됩니다 당신이 호출하는 경우 SaveChangesNULL값을을 위해 childEntity(데이터베이스에 기록됩니다 즉 사이의 관계 두 개가 제거됩니다). 이것은 SQL UPDATE문에서 발생 합니다. DELETE진술이 발생 하지 않습니다 .

    • 관계가 필요하고 (FK에서 NULL값을 허용하지 않음 ) 관계가 식별되지 않는 경우 (즉, 외래 키가 자식 (복합) 기본 키의 일부가 아님) 자식을 다른 부모에 추가하거나 자식을 명시 적으로 삭제해야합니다 ( DeleteObject그런 다음). 이러한 작업을 수행하지 않으면 참조 제한 조건이 위반되고 호출 할 때 EF에서 예외가 발생합니다. "SaveChanges 유명한 " 하나 이상의 외래 키 특성이 널 (null)이 허용되지 않기 때문에 관계를 변경할 수 없습니다 " 예외 또는 비슷한.

    • 관계가 식별되는 경우 (필요한 경우 기본 키의 일부가 될 수 없기 때문에 NULL) EF는childEntityDeleted마찬가지로 . 호출 SaveChanges하면 SQL DELETE문이 데이터베이스로 전송됩니다. 데이터베이스의 다른 참조 제한 조건을 위반하지 않으면 엔티티가 삭제되고 그렇지 않으면 예외가 발생합니다.

나는 사실에 대해 혼란스러워 조금 생각 은 MSDN 페이지의 설명 부분 은 말한다 때문에 연결 한 " 관계가 종속 객체 마크의 관계 및 삭제에 대한 종속 개체를 모두 제거 메소드를 호출, 참조 무결성 제약 조건이있는 경우. ". 위의 세 가지 경우 모두 " 참조 무결성 제약 조건 "이 있지만 마지막 경우에만 실제로 자식이 삭제 되기 때문에 이것은 나에게 부정확하거나 잘못된 것 같습니다 . ( " 종속적 인 개체 " 라는 의미 가 아닌 한, 특이한 용어가되는 식별 관계에 참여하는 개체입니다.)


2
참조 무결성 위키 백과 : 참조 무결성은 충족 될 때 관계 (테이블)의 한 속성 (열)의 모든 값이 다른 (또는 동일한) 관계 (테이블)의 다른 속성의 값으로 존재해야하는 데이터의 속성입니다. ), 관계가 선택적인 경우 데이터 무결성 규칙
Mohammadreza

3
@Mohammadreza : NULL" NULL때때로 조잡하게 쓴" 값 " 대신"값이 아닌 "으로 해석 하면"선택적 관계 "는 참조 무결성의 정의와 모순되지 않습니다.
Slauma

1
그렇다면 EF Core 버전은 ObjectContext.DeleteObject무엇입니까?
Jonathan Allen

13

정말로 Deleted를 사용하려면 외래 키를 null로 설정해야하지만 고아 레코드가 생길 수 있습니다 (먼저 고아 레코드가 발생합니다). 그래서 그냥 사용하십시오Remove()

ObjectContext.DeleteObject (엔티티) 는 컨텍스트에서 엔티티를 삭제됨으로 표시합니다. (이후 EntityState가 삭제됩니다.) 나중에 SaveChanges를 호출하면 EF가 데이터베이스에 SQL DELETE 문을 보냅니다. 데이터베이스의 참조 제한 조건을 위반하지 않으면 엔티티가 삭제되고 그렇지 않으면 예외가 발생합니다.

EntityCollection.Remove (childEntity) 는 상위 항목과 하위 항목의 관계를 삭제됨으로 표시합니다. childEntity 자체가 데이터베이스에서 삭제되고 SaveChanges를 호출 할 때 정확히 발생하는 경우 두 항목 간의 관계 유형에 따라 다릅니다.

주목할 것은 설정 .State = EntityState.Deleted 이 자동으로 감지 된 변경을 트리거하지 않는다는 것입니다. ( 아카이브 )


4
좋아, 내 대답을 다운 투표하는 사람들에게는 Slauma와 아무런 관련이 없습니다 . 둘 다 동일한 문서를 가리 킵니다 . 내 자신의 이론 부분 동안 실제 예제를 설명합니다.
Matas Vaitkevicius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.