2011-09-05 2 views
49

DbSet.Create를 사용할지 아니면 단순히 엔티티를 새로 추가 할지를 혼란스럽게 생각합니다. DbSet.Create 사용의 결과를 실제로 이해하지 못합니다.DbSet.Create 대 new Entity()의 파손

해당되는 경우 DbSet.Create가 프록시 된 버전을 생성한다는 것을 알고 있지만 실제로 그 의미가 무엇인지 이해하지 못합니다. 내가 왜 신경 쓰냐? 게으른로드에 관련된 엔티티가 없으므로 빈 Proxied 클래스는 프록시되지 않은 클래스보다 유용하지 않습니다.

차이점을 분명히 말할 수 있습니까? 그리고 왜 너는 신경 쓰겠 니?

답변

51

DbSet<T>.Create()을 사용하는 시나리오는 기존 엔티티를 컨텍스트에 연결 한 다음 관련 엔티티의 지연로드를 활용하는 것입니다. 예 :

public class Parent 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Child> Children { get; set; } 
} 

public class Child 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

다음은 다음 일 것입니다 : 아이들의

using (var context = new MyDbContext()) 
{ 
    var parent = context.Parents.Create(); 
    parent.Id = 1; // assuming it exists in the DB 
    context.Parents.Attach(parent); 

    foreach (var child in parent.Children) 
    { 
     var name = child.Name; 
     // ... 
    } 
} 

여기에 게으른 로딩 (null을 아마도 하늘의 콜렉션을 결과로 아니지만) 트리거됩니다. context.Parents.Create()new Parent()으로 바꾸면 parent.Children이 항상 null이므로 foreach 루프가 중단됩니다.

편집 또 다른 예는 여기에 있었다

(새로운 엔티티의 외래 키 속성을 채우고 다음 새 개체가 DB에 삽입 한 후 유유히로드 탐색 속성 받고) : Lazy loading properties after an insert

+3

아를. . 나는 당신이 외래 키 ID를 채울 수 있고 모든 게으름없이 게으른로드를 할 수 있다는 것을 몰랐다. 기존 레코드를로드하지 않고 자식 만 원할 경우 유용 할 수 있습니다. –

+0

"context.Parents"가 null 인 경우 어떻게해야합니까? 귀하의 케이스를 시도하고 있지만 실행 가능하지만 불행히도 나를 위해 "context.Parents"가 null이므로 여기에서 예외가 발생합니다. 'System.NullReferenceException '이 (가) YourProject.dll에서 발생했지만 사용자 코드에서 처리되지 않았습니다. 추가 정보 : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. 만약 해결책이 있으시면 알려주십시오. 그래서 나는 다음 노트에서 그것을 극복하고 내 노트에 쓸 것입니다. –