1

Entity Framework를 업그레이드하는 중이고 v5에서 성공적으로 업그레이드되었습니다. (하지만 .NET 4.0 이후로 어셈블리는 실제로 v4.4라고 말합니다.) v6. 우리는 EF5와 EF6가 동일한 결과를내는 다른 방식으로 동일한 IQueryable을 생성하는 문제에 부딪혔습니다.생성 된 쿼리가 Entity Framework 버전간에 다름

LINQ 쿼리는 다음과 같습니다

:

SELECT TOP (2) ID AS ID, StringProperty AS StringProperty FROM MyTable WHERE N'' <> StringProperty

그리고 EF6에서

에서, SQL은 다음과 같습니다 EF5에서 Context.MyTable.SingleOrDefault(x => x.StringProperty != "");

에서, SQL은 (조금 단순화) 다음과 같습니다

SELECT TOP (2) ID AS ID, StringProperty AS StringProperty FROM MyTable WHERE NOT((N'' = StringProperty) AND (StringProperty IS NOT NULL))

StringProperty이 null이면, th e EF5 쿼리는 행을 반환하지 않지만 EF6 버전은 반환합니다. 나는 어디에서나 이것이 문서화 된 것을 보지 못했다. 이 예제는 쉽게 찾을 수 있지만 수정하기는 쉽지 않습니다. 기존 행동을 활성화 할 수있는 방법이 있습니까?

더 중요한 것은 쿼리가 다른 쿼리 결과를 초래할 수있는 다른 방식으로 생성되는 것과 같은 다른 변경 사항이 있는지 알고 싶습니다. EF6의 주요 변경 사항 목록이 있습니까?

답변

2
> Is there a way to turn on the legacy behavior? 

이 게시물 NULL value handling in Entity Framework이 도움이되어야합니다.

이 EF5에서 "

"자동으로 엔티티 프레임 워크에 NULL 비교 로직을 포함합니다 DbContext.ContextOptions.UseCSharpNullComparisonBehavior 스위치, 값이 널 (NULL) 인 경우 쿼리 "false입니다. EF6.0에 UseCSharpNullComparisonBehavior 플래그는 기본적으로 주요 변경을 도입 곳 플래그의 기본값은 true입니다. "

+0

아직 시도하지는 않았지만 필자에게 필요한 것 같습니다. 게시 한 링크에서 기존 동작으로 쿼리를 작성한 방식으로 인해 인덱스를 사용하지 않기로 선택한 SQL 쿼리 계획과 관련된 성능상의 이유로 EF6 기본값 인 true가 권장 값으로 표시됩니다. 이는 향후 독자들에게 중요 할 수 있습니다. – kmc059000

+0

우리는 코드를 먼저 사용하고 의미 상으로 동일하지만 반대입니다. ''DbContext.Configuration.UseDatabaseNullSematics = true''는''UseCSharpNullComparisonBehavior = false''와 같습니다. – kmc059000

관련 문제