2010-11-19 3 views
2

기존 데이터베이스와 함께 EF Code First를 사용하고 있습니다.EF 코드 처음으로 관련 객체를 반환하지 않습니다.

두 제품 :

public Foo 
{ 
    public int FooId {get;set;} 
} 

public Bar 
{ 
    public int BarId {get;set;} 
    public virtual Foo Foo {get;set;} 
} 

모두 FooIdBarId는 데이터베이스의 기본 키, 그리고 Bar 표는 Foo 테이블에 외래 키 가리키는 열 FooId 있습니다.

Bar을 선택하면 Foo은 null 참조입니다. 나는 EF가 그들 둘을 자동으로 끌어 들였을 것이라고 생각했을 지 모르지만, 아마도 나는 무엇인가를 놓치고 있습니까?

데이터베이스 매핑 : 푸의 당신의 기대는 당신이가상 바 객체를 만드는 것이 사실에서 오는 널 안 경우

public class EFCodeFirst : DbContext 
{ 
    public EFCodeFirst() 
    { 
     this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["AlternateString"].ConnectionString; 
    } 

    public DBSet<Foo> Foos {get;set;} 
    public DBSet<Bar> Bars {get;set;} 

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
    { 
     modelBuilder.IncludeMetadataInDatabase = false; 
     modelBuilder.Entity<Foo>().MapSingleType().ToTable("Foo"); 
     modelBuilder.Entity<Bar>().MapSingleType().ToTable("Bar"); 
    } 
} 
+0

코드를 처음으로 게시 할 수도 있습니까? Include ("Foo")를 사용하여 쿼리를 호출하면 어떻게됩니까? –

+0

I'Include ("Foo")가 작동하면. – mattdwen

답변

2

, 그 사건이 아니다. 가상으로 만들면 EF 지연로드를 선택하면 Bar 객체에 액세스하여 명시 적으로 요청할 때까지 null이됩니다. 그 외의 경우, 당신이 그것을 앞두고 채워지기를 원한다면 을 포함하여 열심히로드해야합니다. 메소드를 포함하십시오.

명시 적으로 게으른로드를 사용하지 않도록 설정하려면 탐색 속성에서 가상 키워드 만 제거하고 느린로드가 사라질 수 있기 때문에 다음 코드를 사용할 수 있습니다.

public EFCodeFirst() 
{   
    this.ObjectContext.ContextOptions.LazyLoadingEnabled = false; 
} 

내부적으로 DbContext는 또한 상속 DbContext 클래스 (예를 들어, EFCodeFirst) 내에서 사용할 수있는 보호 ObjectContext를 사용합니다.

+0

그러나 어느 쪽의 방법이라도 여전히 해결해야합니다. DB를 조만간 또는 나중에 호출하십시오. – mattdwen

+0

게으른 로딩을 비활성화 할시기를 알 수 없습니다. 어떤 객체도'ContextOptions.LazyLoadingEnabled'에 대한 참조를 가지고 있지 않습니다. – mattdwen

+0

네, 맞습니다. 제대로 작동합니다. 작동하지 않는 코드를 표시해야합니다. –

0

Foo 클래스에 행이 누락되었습니다. Foo에는 Bar 모음이 있습니다.

+0

현재 부모 Foo에서 Bar 객체에 액세스 할 필요가 없습니다. – mattdwen

+0

예, 그렇지만 EF가 관계를 설정하도록 알려주고, null 참조 예외를 제공하지 않습니다. –

관련 문제