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