3

캐스케이드 복합 키 엔티티를 삭제할 때, 주 피사체 전에 삭제되지 종속 객체. 특히, EF에 의해 방출 된 SQL 명령은 종속 엔티티 이전에 주체 엔티티를 삭제하려고 시도합니다.엔티티 프레임 워크 - 나는 <strong>종속 개체 <strong>복합 키</strong>와</strong>의 <strong>캐스케이드 삭제</strong>에 문제가 있어요

내 EF 모델의 CSDL과 SSDL에 모두 OnDelete="Cascade"이 설정되어 있으며 EF가이를 처리 할 수 ​​있도록 명시 적으로 종속 엔터티를 메모리에로드하고 있습니다. 나는 이것을 다른 FK 관계와 올바르게 작동시키고 EF는 원리를 삭제하기 전에 아이들 엔티티를 올바르게 삭제한다.

그러나이 경우에는 아니며 종속 엔터티에 복합 키가 있기 때문에 문제가 될 수 있습니다. 스키마에 대한 간략한보기 :

Entity A    Entity B     Entity A_B 
    ID (PK)    ID (PK)     A_ID (PK, FK to A) 
               B_ID (PK, FK to B) 

내가 엔티티 A_B의 항목이 내가 엔티티 A를 삭제할 때 삭제 할

나는 ObjectStateManager로보고 A의 A_B 개체가 메모리에로드 및 표시 볼 수 있습니다 삭제를 위해 EF는 A 012를 삭제하기 전에 A 을 삭제하기위한 SQL 명령을 내 보낸다.. 이것은 종속 엔티티가 자신의 PK를 가지고있을 때 제대로 작동하지만 복합 키 일 때 트립 된 것처럼 보입니다. EF의 FK Association (SSDL과 CSDL 모두)에게 Deletes를 Cascaded해야한다고 명시 적으로 말하더라도 먼저 자식을 삭제하지 않습니다.

다시 A와 A_Bs가 모두 메모리에로드되고 ObjectStateManager에 모두 삭제 된 것으로 표시됩니다. Context에 대한 LoadProperty 호출을 통해 메모리에 하위 엔티티를 명시 적으로로드하지만 프록시 생성을 사용하는 POCO를 사용하고 있습니다.

본 사람이 있습니까? 복합 열쇠는 실제로 문제입니까 아니면 혼란입니까? EF가 올바른 순서로 SQL 명령을 처리하는 이유는 무엇입니까?


편집 : 나는 모두 OnDelete (http://msdn.microsoft.com/en-us/library/cc716734.aspx) 및 관계 관리 (http://msdn.microsoft.com/en-us/library/ee373856.aspx)에 대한 설명서를 읽었습니다. "식별 및 비 식별 관계에 대한 고려 사항"섹션은 내가하고 싶은 일이 가능하고 실제로 기대되는 것임을 암시하는 것으로 보입니다. 아마도 데이터베이스의 EF 공급자 어셈블리 내에서 뭔가있을 수 있습니까? IBM.Data.DB2 어셈블리를 사용하는 Informix 데이터베이스와 SQL Server 데이터베이스를 사용하지 않습니다.

(또한 업데이트 : IBM DB2의 v9.7fp3a 및 EF 공급자 베타 새로 고침으로 업데이트 한-http://www.ibm.com/developerworks/forums/thread.jspa?threadID=345634&tstart=0)

답변

0

프레임 워크에 의해 삼켜되고있어 약간의 오차가있을 수는 - 때때로 발생합니다. 나는 DB2 용 Sql 프로파일 러와 동등한 프로그램이 있다고 가정합니다 ... db의 활동을 프로파일 링하고 거기에서 무슨 일이 벌어지는 지 봅니다. 전혀 삭제하라는 요청이 표시되지 않으면 최소한 오류 가능성을 제거한 것입니다.