2013-04-05 2 views
1

나는이 내 프로젝트 (첫번째 EF5, DBContext, 데이터베이스)에서 folling 모델 :탐색 속성

고객

InvoiceAddress -> Addresses (table) 
DeliveryAddress -> Addresses (table) 

그래서 내가 같은 테이블이 외래 키가 있어요 .

나는 다음과 같은 문을 사용하여 고객의 개체를로드

다음 InvoiceAddress의 참조가로드 된 후

var cst = ctx.Customers.Where(c => c.CustomerID == 2).SingleOrDefault(); 
    ctx.Entry(cst).Reference(c => c.InvoiceAddress).Load(); 

는 DeliveryAddress도로드됩니다. 그러나 이것은 송장과 배달 ID가 동일 할 때만 발생합니다. 값이 같지 않으면 DeliveryAddress가로드되지 않습니다. 이 문제의 원인은 무엇입니까? 당신이 간절히 엔티티를 참조하면

, 당신이있어 SELECT 즉시 보내고 :

답변

1

여기 추측이다. 데이터를 가져 오면 엔티티 관리자는 개체 인을 EF 의미로 만듭니다. DeliveryAddressInvoiceAddress은 실제로 동일한 엔티티 (동일한 PK, 복합 키를 사용하는 경우 동일한 복합 키 여야 함)이기 때문에 둘 다 나타내는 동일한 인스턴스를 사용하므로 두 주소 왜로드되지? 그것은 정확히 동일한 엔티티이고, 데이터는 DB의 동일한 행을 가리 킵니다. 참조가 공유되고 메모리가 적게 사용됩니다.

PK가 다른 경우 송장 및 배달 주소는 다른 엔티티로 표시되며 하나를로드해도 다른 주소에는 영향을주지 않습니다.

+0

당신이 sugest하는 것이 센스를 만드십시오. 그러나, 나는 데이터베이스에서 두 개의 서로 다른 외래 키를 정의했으며 엔터티 모델에는 두 개의 키가있다. 배달 주소의 값을 변경하려고하면 '참조 무결성 제약 위반이 발생했습니다' – NRonald

+0

@NRonald 키는 별도이지만 결국에는 동일한 데이터를 가리 킵니다. 나열된 예외는 자세히 설명하지 않고 ([http://stackoverflow.com/a/11596430/1180426] 및 [여기] (http://stackoverflow.com/a/12977804/1180426) 설명하기가 어렵습니다. 정말로 무슨 일이 일어나고 있는지 알고 ... –

+0

'2 개의 다른'종점을 만들 수 있습니까? 지금 볼 수있는 유일한 해결책은 Save() 전에 모든 탐색 속성을 null로 설정하는 것입니다. – NRonald