2011-07-06 4 views
0

문제점 후

올바른 방법은 내가 간단한 클래스가 ... 이것이 할 무엇 확실하지 : 내 MVC에서EF 4.1 POCO 액세스 탐색 속성 Db.Entry()

public partial class Event 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
    public int? PreviousEventId { get; set; } 
    public virtual Event PreviousEvent { get; set; } 
} 

을 3 프로젝트에서 이벤트 설명을 편집하고 (선택적으로) 드롭 다운 목록에서 이전 이벤트를 선택하는 데 사용되는 양식이 있습니다. 양식은 Event에 작업에 제출하고, MVC 3 평소와 같이, 자동적으로 매핑됩니다 :

[HttpPost] 
public ActionResult SaveEvent(Event myEvent) 
{ 
    if (ModelState.IsValid) 
    { 
     Db.Entry(myEvent).State = EntityState.Modified; 
     // do some additional checks 
     Db.SaveChanges(); 
    } 
} 
내가 나의 실체를 저장하기 전에 PreviousEvent에 액세스해야하는 몇 가지 추가 검증을하고 싶습니다

. 그러나 위 코드에서 탐색 속성은 항상 null입니다. 이것은 의미가 있습니다 - 폼은 직접 내 POCO 클래스 인 Event에 매핑되고 EF가 만든 프록시는 매핑하지 않습니다. 교환 할 수있는 방법은

[질문

거기에 내 EF는 탐색 속성을로드로 도울 수 있도록 자사의 프록시 Event을 수정? 내가 할 수있는 :

Db.Entry(myEvent).Reference(e => e.PreviousEvent).Load(); 
// do some checking on myEvent.PreviousEvent 

을 ...하지만 모든 탐색 속성을로드하는이 방법은 일상적인 것 (도시보다,이 클래스에 대한 더 많은있다), 나는 EF는이 일을 더 나은 방법이있다 바라고 있어요. 그것은 실제로합니까?

답변

1

당신이 요구하는 것은 귀하의 행동에 전달 된 엔티티 인스턴스에 대한 지연로드 지원입니다. 게으른 로딩은 EF에서 만든 동적 프록시 (= 동적으로 생성 된 파생 유형)를 통해 제공됩니다. 인스턴스가 프록시없이 생성되면 지연로드를 사용할 수 없으며 인스턴스를 허용하도록 변경할 수 없습니다!

당신이 사용해야 게으른 로딩을 지원하는 인스턴스를 만들려면 :

Event event = context.Events.Create(); 

하지만 기본 모델 바인더는 단순히 기본 생성자를 사용합니다.

Event event = new Event(); 

지연 로딩을 지원하려면 모델 바인더를 작성해야합니다.

일단 프록시 된 인스턴스를 사용하면 인스턴스를 컨텍스트에 연결하기 만하면 지연로드가 효과적입니다.

+0

당신은 별이야,이게 내가 원했던 것처럼 보입니다! 이제는 이벤트의 속성에 동적 프록시의 속성을 바인딩하는 보편적 인 방법을 찾아야 만합니다. – Dav

+0

다른 작업에서 'TryUpdateModel'을 방금 보았습니다. 청구서를 멋지게. 그러나, 내가''Event eventDb = Db.Events.Create(); TryUpdateModel (eventDb);'',''eventDb.PreviousEvent''도 여전히 null입니다. 유형이 동적 프록시 인 경우에도 마찬가지입니다. 왜 그거야? – Dav

+0

컨텍스트에 이벤트를 추가 했습니까? –

관련 문제