2017-04-19 8 views
3

책 엔트리가 있습니다. 책 참고 책가방 (1 대 다수). Backpack 및 Books 묶음의 인스턴스를 만듭니다. 그래서이 경우 책가방에는 배낭이 있습니다. 나는 그 엔티티를 db에 저장하고있다. 그 사람들이 DB에 저장되었는지 확인하고 있습니다. 배낭을로드하려고하면로드가 잘되고 탐색 속성을 제외한 모든 속성이 설정됩니다. 또한 LazyLoading이 비활성화되어 있지 않은지 확인하고 있습니다. 내 탐색 속성에는 가상 키워드가 있습니다. 내가 뭘 잘못하고 있는지 잘 모르겠습니다. 내가 가진 배낭을로드하려고하면()는 책로드 포함 :Entity Framework에서 참조 및 수집 속성을 느리게로드하지 않습니다.

dbContext.Backpacks.Where(b=>b.Name!="").Include("Books").FirstOrDefault() 

가 나는 그것이 느리게 책을로드되지 않는 이유를 알아 내기 위해 노력하고 있습니까? 나는 책을 적재하는 것과 같은 문제가있다. 책을로드 할 때 배낭이 붙어 있지 않습니다. BackpackId가 있다는 것을 알았습니다.

내 속성 getter/setter에서 해고 될 일부 논리가 있지만 어떻게 문제가 될 수 있는지 잘 모르겠습니다.

+0

엔티티를 표시 할 수 있습니까? – DavidG

+0

ProxyCreation도 활성화되어 있습니까? 지연로드가 작동하려면 – Sentry

+0

@Sentry가 필요합니다. ProxyCreation이 활성화되었습니다. 거짓으로 설정했지만 여전히 문제는 없어지지 않았습니다. – Dilshod

답변

3

을하지 않는 경우 더 많은 정보를 제공 자유롭게, 마지막으로 문제를 알아 냈어. 위에서 언급 한 사람들처럼 LazyLoading과 ProxyCreating을 활성화해야합니다. LazyLoading 및 ProxyCreating을 활성화 한 후에도 문제가 발생했습니다. 또한 탐색 속성을 virtual으로 선언해야합니다. 그렇지 않으면 EF가 엔티티를 느리게로드 할 수 없습니다.

내가 겪었던 문제는 내 엔터티에 매개 변수가없는 공용 또는 보호 된 생성자가 없기 때문에 EF가 프록시를 작성하지 않았기 때문입니다. 매개 변수없이 공용 (내 경우에는 보호 된) 생성자를 만든 후 작동했습니다.

참고 : 매개 변수가없는 public/protected 생성자가 없어도 열심히로드에 영향을주지 않습니다.

Here is a link that explains the requirements for the LazyLoading

1

Include() 메서드를 사용하면 열세 로딩이 이루어 지므로 Include("Books")을 사용하여 열심히로드하게됩니다.

변경이이에

dbContext.Backpacks.Where(b=>b.Name!="").Include("Books").FirstOrDefault() 

:

dbContext.Backpacks.Where(b=>b.Name!="").FirstOrDefault() 

는 이제 Books이 더 이상 열심히로드되는 것을 볼 수 없습니다.

참조 : 손에서 제한된 정보와

  1. http://www.entityframeworktutorial.net/EntityFramework4.3/eager-loading-with-dbcontext.aspx
  2. https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx
+0

Include가 엔티티를 열심히로드 할 것임을 알고 있으며, Include를 사용하여 작동 여부를 테스트했습니다. 포함을 사용하지 않고 배낭을 넣으려고하면 탐색 목록에 책이 표시되지 않습니다. – Dilshod

+0

@Dilshod 더 많은 코드를 게시해야합니다. 문제에 대한 당신의 묘사는 절대 의미가 없습니다. – Seany84

3

, 나는 당신의 문제에 대한 다음의 설명을 볼 수 있습니다.

게으른로드 또는 프록시 생성을 가장 먼저 후자없이 작동하지 않습니다

게으른 로딩 및 프록시 생성이 활성화되어 있는지 확인을 사용할 수 없습니다.

dbContext.Configuration.ProxyCreationEnabled = true; 
dbContext.Configuration.LazyLoadingEnabled = true; 

컨텍스트 단순화

을 배치 한 후 개체에 액세스

(자세한 내용은 this SO post 참조)는, 게으른로드는 다음과 같이 작동합니다

  • 것은 당신이 컨텍스트에서 개체를 검색 할 때마다 , 당신은 실제로 당신이 virtual 네비게이션 프로퍼티를 오버라이드 할 것으로 예상되는 클래스의 자동적으로 생성 된 서브 클래스의 객체를 얻습니다. 프록시입니다.
  • 그런 다음 탐색 속성에 액세스 할 때마다 프록시는 데이터베이스에 액세스하고 필요할 때 링크 된 엔터티를로드합니다.

이 마지막 단계는 물론, 단지 개체/프록시 컨텍스트에 여전히 부착이므로 조회 할 수 있습니다 가능하면 검색 할 수있는 데이터베이스 개체를 말했다.

using(var dbContext = new MyContext()) 
{ 
    dbContext.Configuration.ProxyCreationEnabled = true; 
    dbContext.Configuration.LazyLoadingEnabled = true; 
    // Note: You can modify or derive from `MyContext` so that this is 
    //  done automatically whenever a new `MyContext` is instantiated 

    var backpack = dbContext.Backpacks.Where(b=>b.Name!="").FirstOrDefault(); 

    // This should work 
    var firstBook = backpack.Books.FirstOrDefault(); 
} 

// This will probably not, because the context was already disposed 
var firstDrink = backpack.Drinks.FirstOrDefault(); 

난이 도움이되기를 바랍니다,하지만 디버깅의 몇 일 후

+1

ProxyCreation은 기본적으로 사용하도록 설정되었습니다. 나는 그것이 가능하게되어서 LazyLoad 문제를 만든다. 그래서 제 경우에는 ProxyCreation이 활성화되고 LazyLoading이 활성화됩니다. 나는 어떤 것을 시험하고 돌아올거야. – Dilshod