1

는 EF4.1 컬렉션에 항목을 추가하여 데이터베이스에 저장 한 후 이상한 결과를 얻을 것 밖으로 다시 수집을 선택하는 이유는 특별한 이유가 있나요? 내가 초기로드를 수행 할 때EF4.1, 포항 강판, 동적 프록시와 컬렉션

, 컬렉션의 모든 항목은 유형 System.Data.Entity.DynamicProxies.MyClassName_LongString의, 그래서 컬렉션의 다음 선택은 작동합니다

var y = MyCollection.Where(x => x.ValidTo == null).First(); 

예, 항상 컬렉션의 항목이있는 그 기준을 충족시킵니다. 항상.

그러나 컬렉션을 선택하고 변경 사항을 저장 한 다음 동일한 컨텍스트에서 컬렉션의 마지막 항목 (새 항목)을 다시 선택하면 동적 프록시가 아닙니다 대신 내 POCO 유형 (Moo.Model.MyClassName)이다.

위의 동일한 항목을 선택하면 컬렉션의 버전은 null 참조 예외를 throw합니다. 마지막 항목 (비 동적 프록시 1)이 실제로보고있는 기준과 일치하더라도 컬렉션을 수동으로 ...

로드 변화와 자체를 표시하지 않습니다 동작 후 다른 맥락에서 수집 - 그들은 모두 동적 프록시, 그리고 선택의 작품이다.

사람이 문제의 원인이 뭐죠에 관해서는 어떤 생각을 가지고 있습니까? 내가 컬렉션을 선택하면

답변

1

그러나 변경 사항을 저장, 그것은에 새 항목을 추가 한 다음 같은 상황에 다시 컬렉션을 선택, 컬렉션의 마지막 항목 (새가)입니다 하지 동적 프록시하지만 대신 내 POCO 유형 (Moo.Model.MyClassName)이다.

new 연산자를 사용하여 새 항목을 만드는 경우 프록시가 아닙니다. 이미 개체 컨텍스트와 예, 그것은 새로운 (프록시) 객체를 생성하지 않는 경우 첨부 같은 키를 가진 개체가있는 경우 그리고 당신이 엔티티 프레임 워크를 검사하기 때문에 같은 맥락으로 쿼리 할 때 프록시가되지 않습니다 . 따라서 새 엔티티는 여전히 프록시가 아닌 동일한 객체입니다.

당신은 당신이 실제로 당신이 대신 Create 방법 DbSet<T>new 연산자를 사용하지만,하지 않는 것을 의미합니다 첫 번째 장소에서 프록시로 엔티티를 생성해야합니다 이런 식으로 작업하는 경우 :

var newEntity = dbContext.Entities.Create(); 

지금을 , newEntity은 이미 컬렉션에있는 다른 엔티티와 같은 프록시입니다.

설명 된 예외 (동일한 컬렉션의 프록시와 비 프록시 개체의 혼합과 관련이있을 수 있음)가 나타나는 이유는 모르겠지만 Create 메서드를 사용하면 사라질 수 있기를 기대합니다. new 대신.

+0

새로운 이유로 대신 .Create 메서드를 사용하는 이유가 있지만 그 이유는 알 수 없습니다. 건배. – Moo