2016-11-21 3 views
1
public virtual Student Student {get; set;} 

왜 외래 키 제약 조건을 가상으로 표시해야합니까? 나는 가상과 부족한 가상의 예를 보았다. 그게 그렇게 중요한 건가?EF 코드의 외래 키가 처음으로 가상으로 표시되는 이유는 무엇입니까?

+1

가상 키워드가 Entity Framework 4.1 POCO Code First에서 어떤 효과를 낼 수 있습니까? (http : // stackoverflow.com/questions/5597760/what-effects-can-the-virtual-keyword-have-entity-framework-4-1-poco-code-fi – Shoe

답변

1

여기를 보면 : https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx과 @Shoes의 의견에 제공된 링크입니다.

나는이 말 것 :

가상 재산 선언하는 경우

1. 주요 개체를 쿼리 할 때 (기본적으로)

가상 속성이 바로로드되지 않습니다. 데이터베이스에 액세스하려고하거나 해당 구성 요소 중 하나에 액세스하려는 경우에만 데이터베이스에서 검색합니다.

이것은 지연로드라고합니다.

2가 아닌 가상으로 선언하는 경우 : 귀하의 속성 (기본적으로) 바로 당신의 주요 기업에 대한 모든 다른 재산과 함께로드됩니다

. 이것은 귀하의 부동산에 대한 접근 준비가 완료되었음을 의미합니다. 엔터티는이 속성에 액세스하기 때문에 데이터베이스를 다시 쿼리 할 필요가 없습니다.

이것은 열정적으로로드하는 것입니다.

내 의견 : 종종 내가 열심히 (비 가상) 대부분의 시간, 나는 모든 개체의 모든 속성을 필요로하기 때문에 다시에 (빠른 조회 할 필요없이 함께 사용되는로드를 선택

당신이 정말로 모든 것을 빨리 원한다면). 그러나이 속성에 한 번만 액세스하면 (당신이 아무것도 표시하지 않음) 나머지 정보는이 정보를 제외하고는 더 자주 원한다면 가상으로 만들어이 속성이 느려지지 않도록하십시오 몇 가지 액세스에 대해서만 나머지 쿼리를 수행 할 수 있습니다. 이 분명했다

희망 ...

Exemples :

내가 가상 (열심히) 사용을 금지하는 것 :

foreach(var line in query) 
{ 
    var v = line.NotVirtual; // I access the property for every line 
} 

내가 가상 또는 지연로드를 사용합니다 :

foreach(var line in query) 
{ 
    if(line.ID == 509)  // because of this condition 
     var v = line.Virtual; // I access the property only once in a while 
} 

마지막으로 한 가지 :

데이터베이스의 1,000 줄 이상을 쿼리하지 않으면 어떤 항목을 선택하든 큰 영향을주지 않습니다. 또한, 가상 이러한 속성을 선언 할 수 있습니다 당신은 주위에 다른 방법을 테스트하려는 경우, 당신은이 작업을 수행해야한다 :

context.LazyLoadingEnabled = false; 

그것은 가상 효과를 취소합니다.

+0

감사합니다. –

관련 문제