EF4에서 상위/하위 관계가있는 엔티티를 저장하려고하면 문제가 발생합니다. 때로는 자식이 부모 앞에서 삽입 될 것입니다. 이는 명백히 참조 제약 조건에서 문제를 일으킬 것입니다. 두 테이블은 다음과 같이 구성되어 있습니다.노출 된 외부 키없이 잘못된 순서로 저장된 엔티티
OrderHeader
- OrderID (PK)
OrderDetails
- OrderID (PK)
- DetailID (PK)
(더 많은 열이 있지만 중요하지 않습니다.)
참고 : 우리는 OrderDetails.OrderID에 실제 외래 키를 노출하지 않지만 대신 트리거를 사용하여 Details 테이블의 OrderID가 Header 테이블에 존재하도록합니다. FK를 노출하는 것이 빠른 해결책 일 수 있지만 우리의 응용 프로그램에서는 데이터베이스에 대한 이러한 종류의 변경이 허용되지 않습니다. 기존 코드를 다루어야합니다.
.edmx 파일의 XML을 보면 디자이너가 생성 할 때마다 개념 모델 (CSDL 섹션)에서 AssociationSet 및 Association을 만들고 Association에 ReferentialConstraint가 설정되었음을 알았습니다. 그러나 SSDL 섹션에 AssociateSet 또는 Assocation을 만들지는 않습니다. FK가 데이터베이스에 노출 될 때 추가되는 것처럼 보입니다. AdventureWorks 또는 Northwind와 같이 데이터베이스에서 실제 FK를 테스트 한 다른 데이터베이스의 경우 데이터베이스에서 모델을 생성 할 때 EDMX에 SSDL의 Association 및 AssociationSet 섹션이 포함되어있는 것을 볼 수 있습니다.
EF는 우리가 모델 (CSDL)에 갖고있는 연관성을 무시하고 대신 테이블 이름으로 사전 순으로 삽입합니다 - OrderDetail이 OrderHeader보다 먼저 정렬하기 때문에이 경우 운이 좋지 않습니다 (물론, 우리의 경우에는 테이블의 이름을 바꿀 권한이 있습니다). SSDL 섹션에 해당 AssociationSet 및 연관을 수동으로 추가하면 올바른 순서로 저장이 수행됩니다 (먼저 헤더를 삽입 한 다음 세부 정보 삽입). 그러나 '데이터베이스에서 모델 업데이트'를 수행 할 때마다 이러한 수동 변경 사항이 사라져 실제적인 해결책이 아닙니다. 나는 런타임에 역동적으로 수정 작업을하려고 노력했지만 그저 효과가 있어야 할 일을 해결하기위한 많은 노력이 필요하다고 생각했습니다.
EF가 삽입물을 주문할 때 CSDL에 정의 된 참조 제한 및/또는 연관을 존중할 수있는 방법이 있기를 바랍니다.
재현 가능한 샘플이 있습니까? 나는 이것을 여러 번했고 간단하게 작동했습니다 (EFv4에서). –
FK없이 작동 했습니까? 그것은 나를 위해 매번 깨어납니다. 동료가 EF 포럼에 대한 자세한 내용을 게시했습니다. 여기서 재현 가능한 사례를 볼 수 있습니다 : http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/31ffcfa0-e69e-460b-a767-d28376a57fe9 큰 일은 어소시에이션이없는 것 같습니다. SSDL 섹션의 AssociationSet. 그것이 당신을 위해 일할 때, SSDL 섹션에 Association이 있습니까? –
물론 .... 특별한 트리거가 없거나 SQL을 프로파일 링하지 않으면 '잘못된'동작을 놓치기 쉽습니다. FK가 없으면 SQL Server에서 머리글 앞에 Detail을 삽입 할 수 있지만 잘못된 동작입니다. –