3

EF 코드 우선에서 내 탐색 속성을 얻는 데 큰 어려움을 겪고 있습니다. 추상화 예를 들어, 내가 가진 : 다음엔티티 프레임 워크 - 탐색 속성 저장하지 않음

public class Parent{ 
    public int ParentID {get; set;} 
    public virtual List<NamedChild> Children {get; set;} 
    public Parent(){} 
    public void Init(int ParentID, List<UnnamedChild> Children){ 
     this.ParentID = ParentID; 
     this.Children = Children.ConvertAll(x => new NamedChild(x, "")); 
    } 
} 

public class NamedChild{ 
    public int ChildID {get; set;} 
    public string Name {get; set;} 
    public NamedChild(UnnamedChild c, string Name){ 
     this.ChildID = c.ChildID; 
     this.Name = Name; 
    } 
} 

public class UnnamedChild{ 
    public int ChildID {get; set;} 
    public UnnamedChild(int ChildID){ 
     this.ChildID = ChildID; 
    } 
} 

하고 나중에 ... 내가 현재 DbSet로 볼 수 디버깅하고있어 (1) 부모가된다는 사실을 보여주고 자하는 경우

List<UnnamedChild> children = GetChildrenFromSomewhere(); 
Parent p = db.Parents.Create(); 
p.Init(1, children); 
db.Parents.Add(p); 
db.SaveChanges(); 

, "Children"속성은 2 NamedChild의 List로 설정됩니다. 이것은 좋은 일입니다. 그러나 프로그램을 중지하고 다시 실행하면 DbSet을 보면 여전히 1 개의 Parent가 있지만 해당 "Children"속성은 null로 설정되어 있습니다.

요약하면, 값을 저장 한 직후 값은 맞지만 DB 컨텍스트를 다시로드하자마자 해당 값이 누락됩니다 (nulls). LazyLoading을 활성화 한 상태에서 가장 최근 EF를 실행하고 있습니다.

.Include()를 사용하면 Null 값을 적절한 NamedChild 목록으로 채 웁니다. 그러나 LazyLoading을 사용하려면이 값이 필요합니다.

답변

1

내가 EF 아마 NamedChild 개체에 대한 프록시를 만들 수 없습니다 생각, 그리고 그 결과로 어떤 게으른 로딩을 수행 할 수 없습니다.

프록시 클래스를 만들기위한 요구 사항 중 하나는 POCO에 매개 변수가없는 public/protected 생성자가 있어야한다는 것입니다. 난 당신이 이미 지연로드 프록시에 대한 다른 모든 요구 사항을 충족 생각

public class NamedChild 
{ 
    public int ChildID {get; set;} 
    public string Name {get; set;} 

    protected NamedChild() {} 

    public NamedChild(UnnamedChild c, string Name) 
    { 
     this.ChildID = c.ChildID; 
     this.Name = Name; 
    } 
} 

:

이렇게하면 문제를 해결할 수 있습니다. 여기

전체 요구 사항 : 사실 http://msdn.microsoft.com/en-us/library/vstudio/dd468057%28v=vs.100%29.aspx

1

기술적으로는 중요하지 않지만 EF는 다른 목록/배열 유형에 대해 ICollections을 선호하는 것으로 나타났습니다. 시도해보십시오.

public virtual ICollection<NamedChild> Children {get; set;} 

또한 맞춤 생성자를 사용하여 달성하려는 작업에 대해 다소 혼란 스럽습니다. 그것은 당신이하는 모든 일은 인스턴스의 속성을 초기화하는 것으로 보인다. 이 경우 사용자 지정 생성자가 필요하지 않습니다. 그냥 클래스의 초기화 구문을 사용합니다

x => new NamedChild { ChildId = x.ChildId, Name = "" } 
+0

. 그것은 비록 차이를 가져서는 안된다. – Jordan

관련 문제