8

내가 EF navigation property should be virtual에 기억으로 :탐색 속성이 가상이어야합니다 - ef 코어에는 필요하지 않습니까?

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 
    public string Url { get; set; } 
    public string Tags { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

을하지만 EF Core을보고 가상으로 표시되지 않습니다 :

public class Student 
    { 
     public int ID { get; set; } 
     public string LastName { get; set; } 
     public string FirstMidName { get; set; } 
     public DateTime EnrollmentDate { get; set; } 

     public ICollection<Enrollment> Enrollments { get; set; } 
    } 

가 더 이상 필요하지 않습니다?

답변

20

virtual가되었다. 게으른 로딩 지원을 원할 때만 필요했습니다.

Lazy loading is not yet supported by EF Core 이후로 현재 virtual에는 특별한 의미가 없습니다. 지연로드 지원을 추가하는 경우 (및 수행 할 경우) plan이 있습니다.

+0

특별한 의미가 없으면 왜 스캐 폴드가 모든 탐색 속성을 가상으로 생성합니까? –

+0

@CamiloTerevinto 경우에 대비해? 기본적으로? 정말로 중요하지 않습니다. –

+0

꽤 흥미 롭습니다, 사실, 저는 그들이 EF 코어를위한 기본 가상인지 알고 싶습니다. 그렇게 생각하지 않아요. –

3

EF 코어에서는 기본적으로 느린 지연로드 경로를 선택했습니다. 또한이 기능은 여전히이 문제에 따라 구현되지 않았다고 생각합니다. EF의 이전 버전 관련 기관 게으른 부하에 허용되는 가상 탐색의 호텔을

https://github.com/aspnet/EntityFramework/issues/3312

.

나는 지금로드 탐색 속성은 .Include(...)

EDIT로 achived 할 수 있습니다 같아요

코어에서 지원하는로드 관련 기관의 여러 가지 방법이 있습니다

. 는 당신이 관심이 있다면 : EF에서을 요구하지 https://docs.microsoft.com/en-us/ef/core/querying/related-data

8

이 필요 적이있다 ... 여기의 다른 대답

감사합니다, 나는 ... 그것은 ... CORE에 쓸모가 꽤 가상 키 단어를 만드는 EF 코어조차 게으른로드를 지원하지 않는 것을 볼 수

하지만 일반적으로는 :

가상 재산 선언하는 경우

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; 

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

편집 EF의 새로운 버전

:

WhateverEntities db = new WhateverEntities() 
db.Configuration.LazyLoadingEnabled = false;