1

Я занимаюсь модернизацией Entity Framework и успешно обновлен с версии 5 (но поскольку мы на .NET 4.0, сборка фактически говорит v4.4) до последней версии v6. Мы столкнулись с проблемой, когда EF5 и EF6 генерируют один и тот же IQueryable разными способами, которые имеют разные результаты.Сгенерированный запрос отличается от версий Entity Framework

Запрос LINQ является: Context.MyTable.SingleOrDefault(x => x.StringProperty != "");

В EF5, то SQL выглядит следующим образом (немного упрощен):

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

И в EF6, то 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, должен быть полезен.

«DbContext.ContextOptions.UseCSharpNullComparisonBehavior переключателя, который будет автоматически вставлять NULL логики сравнения в свой Entity Framework запросов, когда значения обнуляемые»

«В EF5, то флаг по умолчанию UseCSharpNullComparisonBehavior к ложному. EF6.0 ввело отключающие изменения, где флаг по умолчанию равен true "

+0

Я еще не пробовал, но, похоже, это именно то, что мне нужно. Из опубликованной вами ссылки видно, что значение EF6 по умолчанию - это рекомендуемое значение из-за причин производительности, связанных с планами SQL-запросов, которые предпочитают не использовать индексы из-за того, как поведение по умолчанию создавало запросы. Это может быть примечательным для будущих читателей. – kmc059000

+0

Сначала мы используем код и семантически то же, но наоборот. '' DbContext.Configuration.UseDatabaseNullSematics = true'' эквивалентно '' UseCSharpNullComparisonBehavior = false'' – kmc059000

 Смежные вопросы

  • Нет связанных вопросов^_^