2012-10-02 2 views
8

DbContext.SaveChanges() 메서드를 재정의하고 내 ISoftDelete 인터페이스를 구현하는 엔티티의 삭제를 취소하여 프로젝트에서 소프트 삭제 기능을 구현하려고합니다. 나는 '삭제'상태에 있고 ISoftDelete를 구현하는 모든 항목에 대한 내 SoftDelete() 메서드를 호출하고있는 SaveChanges() 방법에서연관을 사용한 엔티티 삭제 덮어 쓰기

interface ISoftDelete 
{ 
    bool IsDeleted { get; set; } 
} 

:. 다음

var entries = this.ChangeTracker.Entries().Where(x => (x.State == EntityState.Deleted) && x.Entity is ISoftDelete) 
        .ToList(); 
       entries.ForEach(SoftDelete); 

SoftDelete() 방법대로 :

일대일 다른 것이있는 엔티티를 실행할 때까지 완벽하게 작동합니다.

{"A relationship from the 'ChildParent' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Parent' must also in the 'Deleted' state."}

그 실체에 대한 모든 연결을 얻을뿐만 아니라 그들을 위해 삭제 된 상태를 변경할 수있는 방법이 있나요 : 어떤 시점에서, 예외는이 오류와 함께 발생합니다?

저는 이미 실제 연결된 엔티티에 대한 참조를 얻으려고했지만 엔터티의 EntityStateDeleted 대신 Unchanged으로 설정되었습니다.

+3

관련 자체가 삭제 된 것으로 표시됩니다 (연결은 EF에서 별도의 개체로 처리됨). 관련 엔터티는 아닙니다. 이제 EF가 연관을 제거하려고 할 때 관련된 엔티티가 삭제로 표시되지 않았기 때문에이를 수행 할 수 없습니다. 나는 외래 키가 nullable이 아니므로 엔티티를 제거하면 관련 엔티티 (계단식 삭제)를 제거해야한다고 가정합니다. 이 스레드는 http://stackoverflow.com/questions/10300156/ivalidatableobject-is-useless-for-ef-navigation-properties/10304323#10304323에서 확인할 수 있습니다. 관련 객체를 가져 오는 방법을 보여주기 때문에 도움이 될 수 있습니다. – Pawel

+0

관련 객체를 가져 오는 데 도움이되었습니다. 감사합니다. 그러나 관계 중 하나의 상태를 변경하려고하면 "관계의 끝 중 하나가 KeyEntry 인 경우 관계의 상태를 변경할 수 없습니다."라는 이상한 오류가 발생합니다. – Jonathan

+0

[이 해결 방법] (http://connect.microsoft.com/VisualStudio/feedback/details/513174/unable-to-refresh-some-items-in-the-objectcontext)을 보았습니까? –

답변

0

일반적으로 먼저 상위 - 하위 관계에서 하위를 소프트 삭제해야합니다. 가장 위의 부모부터 시작하여 자녀를 통해 길을 다시 찾아보십시오. 방문한 모든 항목을 표시하여 소프트 삭제 된 항목 (역 참조 인 경우)을 추적 할 수 있도록하십시오.

"비즈니스 개체"개념이있는 경우 편리한 탐색을 위해 ChildsParent 속성을 추가 할 수 있습니다. 그렇지 않으면 당신은 사소한 자식 관계로 각 부모에 대해 이것을 "직접 코딩"해야합니다.

또한 하나의 LINQ 문을 사용하면 실제 이송을 제어 할 수 없습니다.

위의 내용은 많은 작업처럼 보이지만, 필요한 관계 정보를 자동으로 유추하는 EF 메커니즘을 장치하는 방법을 고려해보십시오. 이런 일을 제대로 끝내야합니다.