2012-06-27 6 views
4

예제로보기 쉽다 - 먼저 데이터베이스를 구성하기 위해 코드 우선을 사용하고 있습니다. 다음과 같은 수업이 있습니다 :Entity Framework 클래스가 관련없는 클래스의 가상 멤버를 필요로하는 이유

public class Blog 
    { 
     public int Id { get; set; } 
     public string Title { get; set; } 
     public string AuthorName { get; set; } 
     public List<Post> Posts { get; set; } 
     public string BlogCode 
     { 
      get 
      { 
       return Title.Substring(0, 1) + ":" + AuthorName.Substring(0, 1); 
      } 
     } 
    } 

    public class Post 
    { 
     public int Id { get; set; } 
     public string Title { get; set; } 
     public string Content { get; set; } 
     public virtual Blog Blog { get; set; } 
    } 

왜 게시물에 공개 가상 블로그 블로그가 필요한지 이해가 가지 않습니다. 블로그에 다시 링크하기 위해 데이터베이스의 외래 키 역할을합니까? 블로그 ID를 사용하는 경우처럼 보입니다.

+3

만약 Hibernate와 같은 것이라면,'virtual'에 대한 필요성은 동적 프록시가 만들어 져서 lazy-load 기능을 제공하기 위해 멤버를 '오버라이드 (override)'하기 때문입니다. –

답변

8

두 테이블이 관련되어 있고 Post에 외래 키를 두어 Blog과 관련된 외래 키를 배치합니다.

public virtual Blog Blog { get; set; }을 사용하면 Post 개체에서 Blog 개체를 참조한 다음 Blog의 모든 속성에 액세스 할 수 있습니다. 예 : myPost.Blog.Idpublic virtual int BlogId { get; set; }을 사용하는 경우 BlogIdint 값이므로이 작업을 수행 할 수 없습니다.

도메인 객체가 lazy loaded 경우

myPost.Blog 실제로 데이터베이스에서 데이터 수화되지 않습니다 (즉 Blog 테이블에는 전화) 해당 속성까지 사용되지 않습니다. 사용되는 즉시 Entity Framework는 데이터베이스를 호출하고 Blog 테이블의 데이터로 개체를 수분을 공급합니다. 이것은 ORM 사용의 한 부분입니다 ... 데이터베이스 작업을 처리하는 동안 코드에 집중할 수 있습니다.

+0

이것은 실제로 몇 가지 흥미로운 성능 관련 내용을 포함합니다. 게이머가 내비게이션 속성을 사용하려고하면 * 게으른 로딩을 비활성화하여 더 나은 성능을 얻을 수 있음을 알고 있습니다. DB에 잠재적으로 많은 왕복 대신에, 당신은 하나를 만듭니다. 데이터를 가끔씩 만 사용하거나 전혀 사용하지 않는 경우에는 게으른 로딩을 사용하면 필요하지 않은 데이터를로드하는 비용을 줄일 수 있습니다. 물론'select new {your_data_here} '와 같은 일을하기 위해 항상 노력해야하지만, 항상 가능하지는 않습니다. –

관련 문제