다음 두 가지 방법을 사용하여 EF를 사용하여 데이터베이스에서 항목을 제거 할 수 있습니다.
첫 번째는에 EntityCollection
상기 두 번째 ObjectContext
.
각각 언제 사용해야합니까?
하나는 다른 것보다 선호됩니까?
Remove()
a bool
를 DeleteObject()
반환 하고를 반환합니다 void
.
다음 두 가지 방법을 사용하여 EF를 사용하여 데이터베이스에서 항목을 제거 할 수 있습니다.
첫 번째는에 EntityCollection
상기 두 번째 ObjectContext
.
각각 언제 사용해야합니까?
하나는 다른 것보다 선호됩니까?
Remove()
a bool
를 DeleteObject()
반환 하고를 반환합니다 void
.
답변:
두 가지 방법으로 " 데이터베이스에서 항목을 제거 "할 수있는 것은 일반적으로 올바르지 않습니다 . 정확하게 말하자면 다음과 같습니다.
ObjectContext.DeleteObject(entity)
컨텍스트에서와 같이 엔티티를Deleted
표시 합니다 . (그것의가 EntityState
있다 Deleted
그 후.) 당신이 호출하면 SaveChanges
이후에 EF는 SQL의 전송 DELETE
데이터베이스에 문을. 데이터베이스의 참조 제한 조건을 위반하지 않으면 엔티티가 삭제되고 그렇지 않으면 예외가 발생합니다.
EntityCollection.Remove(childEntity)
parent와 childEntity
as 의 관계를Deleted
표시 합니다 . 는 IF childEntity
자체는 데이터베이스에서 삭제하고 당신이 호출 할 때 정확하게 일이되어 SaveChanges
둘 사이의 관계의 종류에 따라 달라집니다
관계가 옵션 , 즉 데이터베이스에 부모에게 아이에서 참조하는 외래 키 허용 NULL
값이 외국은 null로 설정됩니다 당신이 호출하는 경우 SaveChanges
이 NULL
값을을 위해 childEntity
(데이터베이스에 기록됩니다 즉 사이의 관계 두 개가 제거됩니다). 이것은 SQL UPDATE
문에서 발생 합니다. DELETE
진술이 발생 하지 않습니다 .
관계가 필요하고 (FK에서 NULL
값을 허용하지 않음 ) 관계가 식별되지 않는 경우 (즉, 외래 키가 자식 (복합) 기본 키의 일부가 아님) 자식을 다른 부모에 추가하거나 자식을 명시 적으로 삭제해야합니다 ( DeleteObject
그런 다음). 이러한 작업을 수행하지 않으면 참조 제한 조건이 위반되고 호출 할 때 EF에서 예외가 발생합니다. "SaveChanges
유명한 " 하나 이상의 외래 키 특성이 널 (null)이 허용되지 않기 때문에 관계를 변경할 수 없습니다 " 예외 또는 비슷한.
관계가 식별되는 경우 (필요한 경우 기본 키의 일부가 될 수 없기 때문에 NULL
) EF는childEntity
도 Deleted
마찬가지로 . 호출 SaveChanges
하면 SQL DELETE
문이 데이터베이스로 전송됩니다. 데이터베이스의 다른 참조 제한 조건을 위반하지 않으면 엔티티가 삭제되고 그렇지 않으면 예외가 발생합니다.
나는 사실에 대해 혼란스러워 조금 생각 은 MSDN 페이지의 설명 부분 은 말한다 때문에 연결 한 " 관계가 종속 객체 마크의 관계 및 삭제에 대한 종속 개체를 모두 제거 메소드를 호출, 참조 무결성 제약 조건이있는 경우. ". 위의 세 가지 경우 모두 " 참조 무결성 제약 조건 "이 있지만 마지막 경우에만 실제로 자식이 삭제 되기 때문에 이것은 나에게 부정확하거나 잘못된 것 같습니다 . ( " 종속적 인 개체 " 라는 의미 가 아닌 한, 특이한 용어가되는 식별 관계에 참여하는 개체입니다.)
NULL
" NULL
때때로 조잡하게 쓴" 값 " 대신"값이 아닌 "으로 해석 하면"선택적 관계 "는 참조 무결성의 정의와 모순되지 않습니다.
ObjectContext.DeleteObject
무엇입니까?
정말로 Deleted를 사용하려면 외래 키를 null로 설정해야하지만 고아 레코드가 생길 수 있습니다 (먼저 고아 레코드가 발생합니다). 그래서 그냥 사용하십시오Remove()
ObjectContext.DeleteObject (엔티티) 는 컨텍스트에서 엔티티를 삭제됨으로 표시합니다. (이후 EntityState가 삭제됩니다.) 나중에 SaveChanges를 호출하면 EF가 데이터베이스에 SQL DELETE 문을 보냅니다. 데이터베이스의 참조 제한 조건을 위반하지 않으면 엔티티가 삭제되고 그렇지 않으면 예외가 발생합니다.
EntityCollection.Remove (childEntity) 는 상위 항목과 하위 항목의 관계를 삭제됨으로 표시합니다. childEntity 자체가 데이터베이스에서 삭제되고 SaveChanges를 호출 할 때 정확히 발생하는 경우 두 항목 간의 관계 유형에 따라 다릅니다.
주목할 것은 설정 .State = EntityState.Deleted
이 자동으로 감지 된 변경을 트리거하지 않는다는 것입니다. ( 아카이브 )